我有一个JAVA6 GUI处理数据导入到我们的数据库。我已经实现了一个工作JProgressBar。我明白,对GUI所做的更改必须通过事件派发线程完成 - 我认为我没有(正确/完全)。Swing进度条通过Worker更新到EventDispatch线程
后台工作线程,UploadWorker,是通过将在主程序中创建一个的JProgressBar构造,并设置改变直接一旦完成进度条的值:
// when constructed, this gets set to the main program's JProgressBar.
JProgressBar progress;
protected Void doInBackground() throws Exception {
write("<!-- Import starting at " + getCurrentTime() + " -->\n");
boolean chunked = false;
switch (importMethod) {
//do some importing
}
write("<!-- Import attempt completed at " + getCurrentTime() + "-->\n");
//here changes to the GUI are made
progress.setMaximum(0);
progress.setIndeterminate(false);
progress.setString("Finished Working");
return null;
}
这工作正常,但有时(并不总是)抛出好几个NPE在性病出来,用户抱怨:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(Unknown Source)
...etc...
不管怎样,我相信有件事我需要做的就是正确的线程上执行这些更新,正确?怎么样?
刚刚发现SwingUtilities.isEventDispatchThread,非常有用,因为我怀疑返回false。 – tenwest
由于你正在与doInBackground方法中的进度条进行交互,那么我会说你当然违反了Swing的单线程规则 – MadProgrammer
我总是喜欢这个[swing worker example](http://www.javacreed.com/swing-worker-example /) – nachokk