我用於通過更新ProgressBar來監視長時間運行的任務。 長時間運行的任務當然是在Swingworker線程中執行的。來自SwingWorker的jProgressBar更新
我用來編程這樣的事情:
public class MySwingWorkerClass extends SwingWorker<Void, Void> {
private JProgressBar progressBar;
public MySwingWorker(JProgressBar aProgressBar) {
this.progressBar = aProgressBar;
progressBar.setVisible(true);
progressBar.setStringPainted(true);
progressBar.setValue(0);
}
@Override
public Void doInBackground() {
//long running task
loop {
calculation();
progressBar.setValue(value);
}
return null;
}
@Override
public void done() {
progressBar.setValue(100);
progressBar.setStringPainted(false);
progressBar.setVisible(false);
}
}
但最近我發現,我可以通過使用「setProgress」和定義屬性的變化做,做這樣的事情
public class MySwingWorkerClass extends SwingWorker<Void, Void> {
private JProgressBar progressBar;
public MySwingWorker(JProgressBar aProgressBar) {
addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
progressBar.setVisible(true);
progressBar.setStringPainted(true);
progressBar.setValue(0);
setProgress(0);
}
@Override
public Void doInBackground() {
//long running task
loop {
calculation();
setProgress(value);
}
return null;
}
@Override
public void done() {
setProgress(100);
progressBar.setValue(100);
progressBar.setStringPainted(false);
progressBar.setVisible(false);
}
}
我的問題是:我的第一個代碼是可以接受的,還是應該使用setProgress作爲任何原因? 我發現第二個代碼更復雜,在我的情況下,不知道是否有任何優勢或原因使用第二個。
有沒有建議嗎?
編輯 感謝您的回答。作爲總結。 由於進度條更新在EDT之外執行,所以第一個解決方案是「錯誤的」。 第二種解決方案是「正確的」,因爲進度條更新裏面的EDT
執行現在,根據@mKorbel在我的情況下,「有趣」的答案我計算給在HTML文本結果我「插入」(見this link)。我目前的代碼如下。
我出版(串)和我的過程代碼看起來像
@Override
protected void process(List<String> strings) {
for (String s : strings) {
try {
htmlDoc.insertBeforeEnd(htmlDoc.getElement(htmlDoc.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.TABLE), s);
} catch (BadLocationException ex) {
} catch (IOException ex) {
}
}
}
如何重新@mKobel做同樣的在我的案件。我的意思是他使用重寫表格渲染在我的情況下,我應該重寫什麼渲染器(jTextPane?)以及如何?
我認爲你的第二種方法也是錯誤的。你正在使用一個監聽器來設置值,它將調用監聽器,它將設置值,這將調用監聽器等等。我不確定這是否會發生,但是它感覺不對。這樣,您沒有得到SwingWorker的好處,您仍然在設置EDT中進度條的值。 –
['SwingWorker.publish(V ...)'](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#publish%28V...%29) 「這種方法是在'doInBackground'方法內部使用的,以便在處理方法內的* Event Dispatch Thread *上處理中間結果。」 –
@Andrews Thompson:我使用發佈來「發佈」結果,但在這裏http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html設置他們使用setProgress的progressbar值和不發佈,所以? – HpTerm