0

我有一个 GUI,当单击一个按钮时,必须启动一个 while 循环。但是在启动 while 循环时,GUI 将暂停,直到 while 循环终止。有什么办法可以规避这种情况吗?

4

4 回答 4

2

我想通常要防止这种情况发生,您应该Thread为冗长的计算创建另一个,然后通过 EDT 更新 GUI(使用SwingUtilities.invokeLater(Runnable);

因此,在您的情况下,按下该按钮时,它将如下所示:

final Thread thread = new Thread(
        new Runnable(){
            public void run(){
                while(condition){
                    .....
                }
                //update gui
            }
        }
);
thread.start();

或者,如果您使用的是 Java 8,则可以使用 lambda:

final Thread thread = new Thread(
        () -> {
            while(condition){
                .....
            }
            //update gui
        }
);
thread.start();

while您可以通过使用interface充当某种侦听器来删除该循环。

于 2013-08-31T17:34:45.680 回答
0

将您的 while 循环包装在 Runnable 中,并使用线程启动该 runnable。注意:new Thread(r).run();将在同一个线程上运行它。下面的代码不应该。

 Runnable r = new Runnable() {
     public void run() {
         while(whatever){
         //do stuff
         }
     }
 }

 new Thread(r).start();
于 2013-08-31T17:37:34.413 回答
0

正如@kayton 所说,将您的代码包装在 Runnable 中。(或者也许是可调用的)

但是,如果您在整个代码中不断创建和启动自己的线程,很快就会变得难以管理。改为查看 ExecutorService 或 SwingWorker。

于 2013-08-31T17:44:55.003 回答
0

从设计角度来看,这更多是在建议方面,而不是解决技术问题,我认为暂停 GUI 不是一个好主意。您可以显示一个旋转的圆圈,告诉用户窗帘后面正在发生一些动作。暂停屏幕可能会让用户感到厌烦。

于 2013-08-31T18:53:54.523 回答