如何在 JPanel java swing 中移动标签

Posted

技术标签:

【中文标题】如何在 JPanel java swing 中移动标签【英文标题】:How to move labels in a JPanel java swing 【发布时间】:2022-01-09 13:25:30 【问题描述】:

我有一个面板,我想有一个背景图像和两组文本,一个“标题”和文本区域,以便稍后添加文本 如何让文本区域位于图像(标签)之上,或者是否有更好的方法来实现这一点?

` //对于文本(右)

    JPanel textPanel = new JPanel();
    //textPanel.setLayout(); //I don't understand layouts I tried some non really got what I needed
    textPanel.setBorder(border);
    textPanel.setBounds(190, 0, 1300, 886);
    textPanel.setBackground(Color.BLACK);
    
//Imports For inventory Label
    JLabel textLabel = new JLabel(); //Title label
    arrayTXTA = new JTextArea(0,1);//The text I will add later label
    JLabel textLabelbg = new JLabel(); //Background image label
    ImageIcon Teximage =new ImageIcon("src\\emporium\\pkg\\background.jpg");//sets up image for background      
//Code for background image
    textLabelbg.setIcon(Teximage);//adds an image
    textLabelbg.setBounds(70, 5, 1200, 886);
                //TEXT AT 253
//Code for title
    textLabel.setHorizontalTextPosition(JLabel.CENTER);  icon
    textLabel.setVerticalTextPosition(JLabel.TOP);
    textLabel.setForeground(new Color(0,255,0));
    textLabel.setFont(new Font("Blackadder ITC",Font.BOLD,30));
    //textLabel.setBounds(300, 0, 100, 36);
//Code for Text I will add later
    arrayTXTA.setVisible(true);
    arrayTXTA.append("Words");
    arrayTXTA.append("Words");
    arrayTXTA.append("Words");
    arrayTXTA.setForeground(new Color(255,0,0));
    arrayTXTA.setFont(new Font("Blackadder ITC",Font.BOLD,30));
    arrayTXTA.setBackground(new Color(0, 0, 0, 0));
    arrayTXTA.setBounds(25, 0, 0, 0);
    `

Here is a picture of what I am trying to achieve

提前谢谢你

【问题讨论】:

【参考方案1】:

首先

不要使用null 布局,它们对您没有帮助。花时间学习和使用可用的布局管理器,请参阅Laying Out Components Within a Container 了解更多详细信息。

其次

JLabel 是尝试制作背景图像的错误选择。有几个原因,但我们只能说它们并不是真正为这项工作而设计的

第三

从一个自定义组件开始,然后通过它绘制您想要的背景。将其用作JTextArea 的主要容器。

JScrollPaneJTextArea 配置为透明,您将通过它看到背景

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Test 
    public static void main(String[] args) 
        new Test();
    

    public Test() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    JFrame frame = new JFrame();
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                 catch (IOException ex) 
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                
            
        );
    

    public class TestPane extends JPanel 

        private BufferedImage background;

        public TestPane() throws IOException 
            background = ImageIO.read(getClass().getResource("/images/Paper.png"));
            setLayout(new BorderLayout());

            JTextArea ta = new JTextArea("This is some text");
            ta.setOpaque(false);

            JScrollPane sp = new JScrollPane(ta);
            sp.setOpaque(false);
            sp.getViewport().setOpaque(false);

            add(sp);
        

        @Override
        public Dimension getPreferredSize() 
            return new Dimension(background.getWidth(), background.getHeight());
        

        @Override
        protected void paintComponent(Graphics g) 
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.drawImage(background, 0, 0, this);
            g2d.dispose();
        

    

至于你们其他人的布局。很简单,利用多个容器/面板和它们自己的布局管理器,然后将所有这些容器/面板绑定到一个带有合适布局管理器的“主”面板中(BorderLayout 看起来可以工作)

经过深思熟虑...

根据您的需要,我可能会考虑在 paintComponent 方法中添加更多逻辑,以便在容器大小调整到超出基本背景图像大小的情况下绘制更多背景实例,但这取决于图片和您的需求。

虽然比较困难,但您可以将背景直接绘制到JTextArea(通过覆盖它),这将允许背景随着JTextArea 滚动,但还需要您考虑上述要点

【讨论】:

我尝试更改我的代码,当我向包含我的文本区域的面板添加布局时,如果我将应该设置的标签设置为 true,我会丢失标题和文本区域作为背景图片,我看到的图片仍然令人困惑。我也尝试添加您的更改,但是“paintComponent”出现错误,但“paintCompones”除了需要删除@override 部分之外没有错误,如果我摆脱获取观点,我会在 getViewport() 出现错误在 background=ImageIO.. 得到一个错误。很抱歉,我刚刚开始了解为什么我有错误 1.如果您因为布局管理器而“丢失”了组件,那么您就没有正确使用它; 2.paintComponets是错误的方法。如果您在@override 上遇到错误,那么您是从错误的组件扩展而来;我提供的示例有效(您需要提供自己的图像) 1.是的,我需要学习布局管理器,我这样做是作为初学者 Java 课程的“额外功劳”,所以我试图避免在 Swing 中跳得太深,但是哦,好吧。我在基本登录屏幕上进行了布局作为测试!但是当我说失败时,我认为它在另一个面板后面迷路了。但没关系,我需要了解更多信息 2. 我可能会遇到错误,因为我的代码没有像你那样被分解,我有一个“Myframe 类”和 2 个面板和按钮运行整个事情哈哈.我仍然不确定背景画,但我可以再试一次。 从工作的基础开始,然后围绕它包装你的想法。对我来说,我会使用 BorderLayout 并将文本区域(或用于提供背景的面板)放在中心并使用 NORTH 其余部分的位置 哇,我已经工作了 10 天了,呵呵,我想通了,我想我没有意识到,但我在 Jlabel 和 Jtextarea 上方有“背景图像”它有效,可能不如您的修复那么干净。但是你要做什么?哈哈,我想我还是要把它改成 C++ 用于我的下一节课作为我的期末项目,所以我不会在这方面投入太多的工作,我会在我的初级 Java 课程中获得我的“高级代码”的额外功劳和运行 lol 非常感谢您抽出宝贵的时间,虽然我真的很感激,并意识到我的代码是多么混乱,哈哈

以上是关于如何在 JPanel java swing 中移动标签的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个子 JPanel(Java Swing)中的输入触发一个子 JPanel 中的操作?

Java Swing - 如何更改 JPanel 的 TitledBorder 上的字体大小?

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

java swing JPanel添加在JScrollPane上,有垂直的滚动条,可是滚动条拉到底,只显示了JPanel的一部分。

如何在 JFrame/JPanel 中可视化控制台 java

如何在 jPanel 上设置边框?