繁体   English   中英

使用while循环和延迟更新Swing GUI

[英]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();
    }
});
  1. 看起来您的while循环在EDT上,这就是为什么它在执行时冻结GUI的原因。 切勿在EDT上调用Thread.sleep

  2. SwingUtilities.invokeLater所做的所有操作都是将Runnable放入队列中,以便EDT在某个时间点运行它。 SwingUtilities.invokeLater应该从非EDT线程运行。 不需要使用SwingUtilities.invokeLater启动Swing计时器。 您可以直接从EDT启动它。

  3. Swing计时器使用一个单独的线程来运行,并在EDT线程上定期调用指定的ActionListener

您可以将while循环替换为swing计时器(以1秒的间隔说),并在其actionPerformed调用中检查game.getCompTotal() < 17条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM