【问题标题】:JLabel not visible on JpanelJLabel 在 Jpanel 上不可见
【发布时间】:2011-12-01 10:25:55
【问题描述】:

我正在开发一个程序,其中我使用了JTextAreaJButtonJLabelJPanel
我要实现的逻辑是:用户在给定的textArea 中键入文本,然后单击button。单击按钮时,我将从textArea 中检索文本并使用书面文本创建一个label(如textArea)并将其显示在panel 上。
我之前所做的一切都是正确的,但问题在于labelpanellabelpanel 上不可见。

sn-ps的代码是:

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");
    }
}

【问题讨论】:

    标签: java swing jpanel jlabel


    【解决方案1】:

    在动态添加新组件后,您需要重新绘制()/验证()面板。所以在这之后:

    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的大小问题。

    【讨论】:

    • 添加了magnet.validate(),但仍然无法正常工作。 reapint()validate() 都不起作用。我想让labelpanel 上可见。
    • 我用过setLocation() 现在已经够用了,因为setBounds() 可能会修剪文本。 setBounds() 也不起作用。我请求您通过执行检查代码。
    • @MohammadFaisal:不。当您在布局中使用null 时,您必须明确定义组件的边界。
    • @AndrewThompson:嗯……现在我明白了。 Mohammad Faisal:代替 setBounds() 使用 setSize(getPreferedSize()) 和 setLocation();这可能对你有用。
    • @AndrewThompson:我已经更新了答案。现在合适吗?
    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多