Обновление jProgressBar от SwingWorker

Я использую для мониторинга длительной задачи, обновляя 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?) и как?

12
задан Community 23 May 2017 в 12:17
поделиться