组件未出现在ContentPane中

时间:2018-11-20 22:29:32

标签: java swing components containers jlabel

在我的应用程序中,我有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));
                }
            }
        });
    }
}

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

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

1 个答案:

答案 0 :(得分:1)

第一件事;

-修改GUI的任何操作都必须在事件分发线程(EDT)中完成。您可以从this answer.

中了解更多原因。

您必须致电:

 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();

除此之外,我在您的代码中看到您使用Button而不是JButton,我认为这只是一个输入错误。它应该是JButton。也是

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

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

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