首页 > 解决方案 > 组件未出现在 ContentPane 中

问题描述

在我的应用程序中,我有一个 6 列表Jlabels,它们被添加到contentPane循环for中。之后,我添加 2 JButtons- 一个用于删除所有标签,第二个用于再次添加它们:

public class Test {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test window = new Test();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Test() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 960, 620);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().setLayout(null);
        frame.getContentPane().setBackground(new Color(30, 30, 30));


        LinkedList<JLabel> labels = new LinkedList<>();
        for(int i = 0 ; i < 6 ; i++) {
            labels.get(i).setSize(280, 50);
            labels.setBackground(new Color(75, 75, 75));
            labels.setOpaque(true);
        }

        Button buttonAdd = new JButton("Add");
        buttonAdd.setBounds(310, 15, 150, 50);
        buttonAdd.addMouseListener(new MouseAdapter() {
            @Override
            public final void mouseClicked(MouseEvent event) {
                for(int i = 0 ; i < 6 ; i++) {
                    labels.get(i).setLocation(15, 15+50*i);
                    frame.getContentPane().add(labels.get(i));
                }
            }
        });

        Button buttonRemove = new JButton("Remove");
        buttonRemove.setBounds(310, 15, 150, 50);
        buttonRemove.addMouseListener(new MouseAdapter() {
            @Override
            public final void mouseClicked(MouseEvent event) {
                for(int i = 0 ; i < 6 ; i++) {
                    frame.getContentPane().remove(labels.get(i));
                }
            }
        });
    }
}

当我在 linsteners 之外添加 6 个标签时,它们被正确添加到ContentPane并显示。然而,当我尝试通过按钮执行此操作时,单击时buttonAdd没有任何反应。它们不会显示。

我尝试弄乱层次结构,手动设置索引但没有任何效果。我怀疑 MouseListeners 但我不知道为什么这不起作用。

标签: javaswingcomponentscontainersjlabel

解决方案


首先要做的事;

- 任何修改 GUI 的操作都必须在事件调度线程 (EDT) 中完成。您可以从这个答案中阅读更多为什么需要它。


您必须致电:

 Test.this.frame.revalidate();
 Test.this.frame.repaint();

如下所示:

           for ( int i = 0; i < 6; i++ )
           {
              final JLabel l = labels.get( i );
                              l.setLocation( 15, 15 + (50 * i) );
              Test.this.frame.getContentPane().add( l );
           }
           Test.this.frame.revalidate();
           Test.this.frame.repaint();

除了我在您使用的代码中看到ButtonJButton,我假设这只是一个打字错误。应该是JButton。还

    for(int i = 0 ; i < 6 ; i++) {
    labels.get(i).setSize(280, 50);
    labels.setBackground(new Color(75, 75, 75));
    labels.setOpaque(true);
    }

这段代码是错误的,标签是 alist不是 a JLabel。定义局部变量

JLabel labelToAdd = labels.get(i)
labelToAdd.setSize(280, 50);
labelToAdd.setBackground(new Color(75, 75, 75));
labelToAdd.setOpaque(true);

推荐阅读