[英]Updating Swing GUI with while loop and delay
我有一个while循环,应该更新程序数据和GUI,但是GUI部分会冻结,直到while循环执行完毕。
这是我的代码:
while(game.getCompTotal() < 17) {
try {
Thread.sleep(2500);
} catch (Exception ex){
ex.printStackTrace();
}
game.compHit(); // Program data update
updateCardPanels(); // GUI update -- Does not update until the while loop finishes.
if(game.checkCompBust()){
if(JOptionPane.showConfirmDialog(this, "Dealer Busted. Play again?") == JOptionPane.YES_OPTION){
init(); // Reset
}
}
}
我已经尝试过使用SwingUtilities.invokeLater()
和Swing Timer
但是我并没有真正了解SwingUtilities.invokeLater()
工作方式或如何在EDT上使用Swing Timer
。 我的问题是,如何在while循环中与程序数据同时进行GUI更新?
这是我尝试的invokeLater()
代码:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Timer t = new Timer(100, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
updateCardPanels();
}
});
t.setInitialDelay(0);
t.start();
}
});
看起来您的while循环在EDT上,这就是为什么它在执行时冻结GUI的原因。 切勿在EDT上调用Thread.sleep
。
SwingUtilities.invokeLater
所做的所有操作都是将Runnable
放入队列中,以便EDT在某个时间点运行它。 SwingUtilities.invokeLater
应该从非EDT线程运行。 不需要使用SwingUtilities.invokeLater
启动Swing计时器。 您可以直接从EDT启动它。
Swing计时器使用一个单独的线程来运行,并在EDT线程上定期调用指定的ActionListener
。
您可以将while
循环替换为swing计时器(以1秒的间隔说),并在其actionPerformed
调用中检查game.getCompTotal() < 17
条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.