JPanel 上的 JLabel 不可见

4
我正在开发一个程序,其中我使用了JTextAreaJButtonJLabelJPanel。实现的逻辑是:用户在给定的textArea中输入文本,然后单击button。在按钮单击时,我需要从textArea中检索文本,并创建一个包含所写文本(如textArea中所示)的label并在panel上显示它。之前所有的操作都是正确的,但问题出在labelpanel上。在panel上无法看到label
代码片段如下:
import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;

/**
 *
 * @author mohammadfaisal
 * http://ermohammadfaisal.blogspot.com
 * http://facebook.com/m.faisal6621
 * 
 */
public class CodeMagnets extends JFrame{
    private JTextArea area4Label;
    private JLabel codeLabel;
    private JButton createButton;
    private JPanel magnet;

    public CodeMagnets(String title) throws HeadlessException {
        super(title);
        magnet=new JPanel(null);
        JScrollPane magnetScroller=new JScrollPane(magnet);
              magnetScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        magnetScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        add(BorderLayout.CENTER, magnetScroller);
        JPanel inputPanel=new JPanel();
        area4Label=new JTextArea(5, 30);
        area4Label.setTabSize(4);
        JScrollPane textScroller=new JScrollPane(area4Label);
        inputPanel.add(textScroller);
        createButton=new JButton("Create code magnet");
        createButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //codeLabel=new JLabel(area4Label.getText());
                codeLabel=new MyLabel(area4Label.getText());//this is for my new question
                codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
                codeLabel.setLocation(50, 20);
                codeLabel.setVisible(true);
                magnet.add(codeLabel);
                area4Label.setText("");
                //pack();
            }
        });
        inputPanel.add(createButton);
        add(BorderLayout.SOUTH, inputPanel);
        //pack();
        setSize(640, 480);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new CodeMagnets("Code Magnets");
    }
}
2个回答

7
在您动态添加新组件后,需要对面板进行repaint()/validate()操作。所以在以下操作完成后:
magnet.add(codeLabel);

添加这个:

magnet.validate();

或者

magnet.repaint();

此外,您正在为磁吸面板使用空布局。因此,在将其添加到磁吸面板之前,必须设置jLable的setBounds()。因此,代码应该如下所示:
public void actionPerformed(ActionEvent e) {
    codeLabel=new JLabel(area4Label.getText());
    codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
    codeLabel.setBounds(50, 20, 100, 100);
    magnet.add(codeLabel);
    magnet.repaint();
    area4Label.setText("");
}

不建议使用 null 作为布局,您应该根据需要使用适当的布局,例如 BorderLayout、GridLayout 或甚至更简单的 FlowLayout。


如 @Andrew 所说,可以使用以下类似方法:

codeLabel.setSize(codeLabel.getPreferredSize());
codeLabel.setLocation(50, 20);

代替
codeLabel.setBounds(50, 20, 100, 100);

这将解决jLabel的大小问题。

2
@MohammadFaisal:不可以。当您在布局中使用null时,必须显式定义组件的边界。 - Harry Joy
1
好的 - 我认为null布局应该被替换为自定义布局,但我对答案的主要反对意见是setBounds()在组件的大小方面需要猜测太多。即使使用null布局,最好也将其设置为首选大小,然后调用setLocation()而不是setBounds() - Andrew Thompson
@AndrewThompson:setLocation()不起作用。我必须强制使用setBounds()。在使用setBounds()后,我能获取首选大小吗? - Mohammad Faisal
1
@AndrewThompson:嗯...我明白了。Mohammad Faisal:你可以使用setSize(getPreferedSize())和setLocation()而不是setBounds()。这可能对你有用。 - Harry Joy
1
@AndrewThompson:我已经更新了答案。现在正确吗? - Harry Joy
显示剩余8条评论

-1
public void actionPerformed(ActionEvent e) {
codeLabel=new JLabel(area4Label.getText());
codeLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
codeLabel.setBounds(50, 20, 100, 100);
codeLabel.setOpaque(True);
magnet.add(codeLabel);
magnet.repaint();
area4Label.setText("");

}


由于您当前的回答不够清晰,请 [编辑] 添加更多细节以帮助其他人理解您如何回答该问题。您可以在 帮助中心 找到有关编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接