动态添加按钮框架

时间:2014-04-07 16:17:07

标签: java swing jframe thread-sleep

我有一个JFrame类

public class SettingsFrame extends JFrame {
 public FirstSettingsFrame() throws HeadlessException {
    setTitle("Settings");
    setSize(600, 400);
    ...
    JButton searchModels = new JButton("Start");
    searchManyModels.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent actionEvent) {

            JFrame frame = new JFrame();
            frame.setSize(new Dimension(800, 600));
            frame.setLayout(null);
            frame.setVisible(true);

            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                JButton button = new JButton("Test");
                button.setBounds(i * 10, i * 10, 20, 20);
                frame.add(button);
                System.out.println("i = " + i);
            }
        }
    });

 add(searchModels);
 ...
}

没有添加任何内容,而循环正在处理中。仅在循环结束时添加所有按钮。我希望它们在循环时添加。我该如何管理?

已编辑:

这段代码

 @Override
        public void actionPerformed(ActionEvent actionEvent) {


            JFrame frame = new JFrame();
            JPanel panel = new JPanel();

            frame.setSize(new Dimension(800, 600));

            frame.add(panel);
            frame.pack();
            frame.setVisible(true);

            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                JButton button = new JButton("Test");
                button.setBounds(i * 10, i * 10, 20, 20);
                panel.add(button);

                panel.revalidate();
                panel.repaint();
                frame.pack();
                System.out.println("i = " + i);
            }
        }
    });

仅改变帧大小,而不是在循环时添加任何内容

编辑2:

删除Thread.sleep并写入循环(long i = 0; i&lt; 100000000000l; i ++){完全没有影响。

1 个答案:

答案 0 :(得分:4)

不要使用空布局!!!

Swing旨在与布局管理器一起使用。然后,从可见GUI添加/删除组件的基本代码是:

panel.add(...);
panel.revalidate(); // to invoke layout manager 
panel.repaint(); // to paint components. 

阅读How to Use Layout Managers上的Swing教程中的部分以获取更多信息。

  

仅在循环结束时添加所有按钮。我希望它们在循环时添加。我该如何管理?

Thread.sleep()阻塞了事件调度线程,因此在循环执行完毕之前,GUI无法自行重绘。请查看我上面提供的链接中的Table of Contents,并阅读Concurrency上教程中的部分以获取更多信息。您应该使用Swing Timer(这也是教程中的主题),而不是循环。