我有一个小问题,我想在一个线程中做一些事情,然后在它完成后打开一个新的GUI窗口。我找到了几个解决方案:
是创建一个线程并在线程内部完成我的工作并在更新我的GUI之后排队,对我来说这种方式感觉不好,因为我觉得通过一个没有的线程来更新我的GUI用于更新GUI并不是最好的主意。
new Thread(() -> {
doSomethingsHere()
updateGui();
}).start();
使用完全为此构建的SwingWorker,但需要很多行,并且这样做几次可能会使我的代码有点混乱。
public void doThingsInBackground() {
SwingWorker<Void,Void> SwingWorker = new SwingWorker<Void, Void>(){
protected Void doInBackground(){
doSomethingsHere()
return (Void) new Object();
}
protected void done(){
updateGui();
}
};
SwingWorker.execute();
}
使用一个线程和一个监听器,就像一个自定义事件,当线程结束事件运行时,由于某种原因,这对我来说是最好的。
我的问题是,这是最好的&#34;好的做法&#34;?
答案 0 :(得分:0)
SwingUtilities.invokeLater(Runnable);
或SwingWorker
是可行的方法。从Thread
更新UI将无效,因为需要在EDT(事件调度线程) - 主线程中处理UI事件。
SwingUtilities.invokeLater(Runnable);
可以运行到EDT进行处理。 process(List)被调用时,SwingWorker也在这样做。