Java 在框架中动态添加按钮
我有一个JFrame类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
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加工