SwingWorker
用于以下目的:
done()
方法在任务结束时使用长时间运行的任务生成的结果更新GUI。publish()
和process()
方法的帮助下,由任务生成和发布的中间结果,不时更新GUI。 SwingUtilities.invokeLater()
可以按如下方式执行上述任务:
SwingWorker.execute()
而不是从EDT执行ExecutorService.submit(new MyRunnable())
方法,因为它还会创建另一个可以执行长时间运行任务的线程。done()
。SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
放在case1中调用process()
方法的地方。< / LI>
我问的是这个问题,因为问题Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT中指定的问题可以通过SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())
解决,但无法通过publish()
来解决
答案 0 :(得分:6)
SwingWorker
是一个帮助类 - 它不是你需要使用它,但使用它比手工完成同样的工作要简单得多,也更清晰。 (它还使检查进度更容易。)请注意,它已添加版本6 - 之前有些人使用了Swing Tutorial中定义的更简单的类,或者执行了类似于您所记录的类的步骤。
答案 1 :(得分:1)
1.6+ SwingWorker类的一个重要特性是doInBackground()和done()之间的EDT(Event Dispatch Thread)区别。您应该将doInBackground()视为doWorkOutsideEDT()和done()作为doWorkInsideEDT()。运行此教学示例以查看不同的内容。
System.out.println("TID=" + Thread.currentThread().getId() + " (main)");
final SwingWorker<String, String> x = new SwingWorker<String, String>() {
@Override
protected String doInBackground() throws Exception {
final long tid = Thread.currentThread().getId();
System.out.println("");
System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
System.out.println("Long running code goes here.");
return "";
}
@Override
protected void done() {
final long tid = Thread.currentThread().getId();
System.out.println("");
System.out.println("TID=" + tid + " done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread());
System.out.println("GUI updates/changes go here.");
}
};
x.execute();
x.get();
输出:
TID=1 (main)
TID=9 doInBackground() isEventDispatchThread=false
Long running code goes here.
TID=16 done() isEventDispatchThread=true
GUI updates/changes go here.