所以我有一个按钮打开一个while循环,然后我的整个GUI冻结,直到while循环结束,据说如何将我的GUI线程每隔一秒更新一次?
JButton Test= new JButton();
Test.setText("Test");
Test.setSize(230, 40);
Test.setVisible(true);
Test.setLocation(15, 290);
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
int x = 0;
while(x<500){
x++
});
答案 0 :(得分:3)
最大的想法是你的GUI冻结,因为你正在负责绘制GUI的线程中进行大量处理;解决方案是委托计算或任何易于花时间处理将在后台执行的线程的处理。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
答案 1 :(得分:2)
这很明显,因为Swing对象不是线程安全的,所以你提供了SwingUtilities.invokeLater()
,这允许在稍后的某个时间点执行任务。
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
int x = 0;
while(x<500){
x++
}
}
});
答案 2 :(得分:1)
使用ExecutorService
类
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ExecutorService es = Executors.newCachedThreadPool();
es.submit(new Runnable() {
@Override
public void run() {
int x = 0;
while (x < 500) {
x++;
}
}
});
}
});