Я использую для отслеживания долговременной задачи путем обновления ProgressBar. Задача с длительной работой, конечно же, выполняется в потоке Swingworker.
Я использовал для программирования такие вещи:
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 для anyreason? Я считаю, что второй код более сложный и в моем случае и не знаю, есть ли какое-либо преимущество или причина для использования второго.
Любые советы?
ИЗМЕНИТЬ Спасибо за ответ. Как резюме. Первое решение является "неправильным" из-за того, что обновление индикатора выполнения выполняется вне EDT. Второе решение является "правильным", потому что обновление индикатора выполнения выполняется внутри EDT
Теперь, согласно "интересному" ответу @mKorbel, в моем случае мой расчет дает результаты в тексте HTML, который я "вставляю" (см. эту ссылку). Мой текущий код следующий.
Я публикую (строка), и мой код процесса выглядит так
@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?) И как?