Я использую для мониторинга длительной задачи, обновляя ProgressBar. Длительная задача, конечно же, выполняется в потоке Swingworker.
Раньше я программировал подобные вещи:
public class MySwingWorkerClass extends SwingWorker {
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 {
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, который я «вставляю» (см. ] эта ссылка). Мой текущий код следующий.
Я публикую (строка), и мой код процесса выглядит так
@Override
protected void process(List 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?) и как?