目前,我正在为自己制作娱乐版的Conway的《人生游戏》。到目前为止,一切都进行得很顺利,但是当我测试某些最终零件时,我注意到了一个令人讨厌的错误。该代码的主体位于一个while循环内,该循环由用户希望看到的游戏“世代”数量控制。在执行此循环时,JFrame的红色X拒绝响应,而我对此茫然无措。

我遇到此问题的区域:

public void run(int steps) throws InterruptedException{
    int a = 0;
    do{
        step();
        myDisp.update(myDisp.getGraphics());
        Thread.sleep(delay);
        a++;
    }while(a < steps);
}

最佳答案

我建议您将这种处理放在单独的线程中。
只要将其保留在代码主体中,只要循环正在运行,Swing组件就不会响应任何用户交互。

this page中,您可以找到有关Swing应用程序中异步操作的一些良好做法。我想强调以下主题之一:


  规则2:不要在事件线程上运行耗时的操作。
  
  我将继续重复这一点:Swing对所有GUI事件使用一个线程。如果您的事件处理程序正在通过网络上传一个数兆字节的文件,那么这些事件将被延迟,直到您完成操作为止。该规则涉及一种平衡行为:某些操作(例如获取文件的大小)是如此之快,以至于不会干扰用户。但是,这并不是变得轻率的原因,因为有一天您的用户将获得驻留在具有间歇网络连接的文件服务器上的文件的大小。


This other page还显示了如何在Swing应用程序中处理长时间运行的任务的示例。您可能还想看看SwingWorker类。

09-25 22:30