Java 在框架中动态添加按钮

Java 在框架中动态添加按钮,java,swing,jframe,thread-sleep,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.addActionLi

我有一个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);
 ...
}
公共类设置框架扩展JFrame{
public firstsettings frame()抛出HeadlessException{
setTitle(“设置”);
设置大小(600400);
...
JButton searchModels=新JButton(“开始”);
searchManyModels.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(ActionEvent ActionEvent){
JFrame=新JFrame();
框架设置尺寸(新尺寸(800600));
frame.setLayout(空);
frame.setVisible(true);
对于(int i=0;i<10;i++){
试一试{
睡眠(800);
}捕捉(中断异常e){
e、 printStackTrace();
}
JButton按钮=新JButton(“测试”);
按钮.立根(i*10,i*10,20,20);
框架。添加(按钮);
System.out.println(“i=“+i”);
}
}
});
添加(搜索模型);
...
}
循环处理时不添加任何内容。所有按钮仅在循环完成时添加。我希望它们在循环时添加。我如何管理

编辑:

这个密码呢

 @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);
            }
        }
    });
@覆盖
已执行的公共无效操作(ActionEvent ActionEvent){
JFrame=新JFrame();
JPanel面板=新的JPanel();
框架设置尺寸(新尺寸(800600));
框架。添加(面板);
frame.pack();
frame.setVisible(true);
对于(int i=0;i<10;i++){
试一试{
睡眠(800);
}捕捉(中断异常e){
e、 printStackTrace();
}
JButton按钮=新JButton(“测试”);
按钮.立根(i*10,i*10,20,20);
面板。添加(按钮);
panel.revalidate();
panel.repaint();
frame.pack();
System.out.println(“i=“+i”);
}
}
});
仅更改帧大小,循环时也不添加任何内容

编辑2:


删除Thread.sleep和写入循环as for(long i=0;i<1000000000l;i++){根本不起作用。

不要使用空布局

Swing设计用于布局管理器。然后,从可见GUI添加/删除组件的基本代码是:

panel.add(...);
panel.revalidate(); // to invoke layout manager 
panel.repaint(); // to paint components. 
有关更多信息,请阅读上的Swing教程部分

只有在循环完成时才添加所有按钮。我希望在循环时添加这些按钮。我如何管理这些按钮


Thread.sleep()正在阻止事件分派线程,因此在循环执行完成之前,GUI无法重新绘制自身。请查看我上面给出的链接中的
目录
,并阅读
并发性
教程中的部分以了解更多信息。您应该使用
摆动计时器
(这也是本教程的主题),不是循环。

不要使用空布局

Swing设计用于布局管理器。然后,从可见GUI添加/删除组件的基本代码是:

panel.add(...);
panel.revalidate(); // to invoke layout manager 
panel.repaint(); // to paint components. 
有关更多信息,请阅读上的Swing教程部分

只有在循环完成时才添加所有按钮。我希望在循环时添加这些按钮。我如何管理这些按钮


Thread.sleep()正在阻止事件分派线程,因此在循环执行完成之前,GUI无法重新绘制自身。请查看我上面给出的链接中的
目录
,并阅读
并发性
教程中的部分以了解更多信息。您应该使用
摆动计时器
(这也是本教程中的一个主题),而不是循环。

删除Thread.sleep并编写循环as(long i=0;i<1000000000l;i++){根本不会影响。
-这不是建议。是否使用Thread.sleep()或者阻塞CPU将是一个愚蠢的循环,你仍在阻塞EDT,因此GUI无法重新启动。请花一些时间阅读教程,了解Swing的基本工作原理,不要尝试走捷径!是的,它与计时器一起工作,但我不需要计时器。我在这里放置Thread.sleep仅用于模拟真正的长期工作人员,什么是pr在每次迭代中进行处理(从internet获取数据,修改,保存新数据,(在这里重新绘制框架!),转到下一次迭代)。所以它总是需要随机时间,所以计时器在这里是无用的。我如何处理这个问题?
从internet获取数据,
-在从internet处理数据时,您不能阻止EDT。您需要使用单独的线程进行internet处理。请按照我的建议阅读有关
并发性的教程。您可能会使用
Swing Worker
在这种情况下。1)Java GUI可能必须在多个平台上工作,使用不同的屏幕分辨率和不同的PLAF。因此,它们不利于组件的精确放置。要组织组件以获得强健的GUI,请改为使用布局管理器,或者与布局填充和边框一起使用…..2)不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。而不是调用
Thread.sleep(n)
为重复任务实现Swing
计时器,或为长时间运行的任务实现
SwingWorker
。有关更多详细信息,请参阅。
删除Thread.sleep并编写循环(long i=0;i<100000000000l;i++){根本不起作用。
-这不是建议。是否使用Thread.sleep()或者阻塞CPU将是一个愚蠢的循环,你仍在阻塞EDT,因此GUI无法重新启动。请花一些时间阅读教程,了解Swing的基本工作原理,不要尝试走捷径!是的,它与计时器一起工作,但我不需要计时器。我在这里放置Thread.sleep仅用于模拟真正的长期工作人员,什么是pr加工