我有一个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 ++){完全没有影响。
答案 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
(这也是教程中的主题),而不是循环。