Использование Swingworker для постоянного обновления графического интерфейса

В моем коде пользователь нажимает кнопку, а затем я хочу, чтобы это вызывало фоновый поток SwingWorker, где я в основном перебираю список, перекрестно ссылаюсь на него с другими данными, а затем обновляю графический интерфейс с помощью JLabel для каждого прохода через мой петля. Проблема в том, что я знаю, что должен сделать это в doInBackground(), но мне нечего возвращать, и я также хочу обновлять JPanel с новым JLabel каждый раз, когда мой цикл зацикливается. Как мне это сделать? Спасибо!


person user2716980    schedule 26.08.2013    source источник
comment
Вы можете передать Void в качестве аргумента типа в объявление SwingWorker.   -  person Sotirios Delimanolis    schedule 26.08.2013


Ответы (2)


Вот полный пример, который мне очень нравится Пример Swing Worker

Вы должны использовать publish() и переопределить process()

Пример:

class Worker extends SwingWorker<Void, String> {

    @Override
    protected void doInBackground() throws Exception {
       //here you make heavy task this is running in another thread not in EDT
       //process after some time call publish() 


    }

    @Override
    protected void process(List<String> chunks) {
        //this is executed in the EDT
        //here you update your label
    }
}
person nachokk    schedule 26.08.2013

Прочтите руководство Swing по использованию Swing Worker, особенно раздел, посвященный Tasks that Have Interim Results.

Вы захотите вызвать метод publish() по мере необходимости в вашем цикле.

person camickr    schedule 26.08.2013