Java - SwingWorker - проблема в методе process () - PullRequest
3 голосов
/ 28 апреля 2010

Я впервые использую javax.swing.SwingWorker.

Я хочу обновить JLabel из промежуточных результатов, опубликованных рабочим колебания, следующим образом:

publish("Published String");

Теперь, чтобы обновить JLabel, я кодировал следующее:

process(List<String> chunks) {
    if (chunks.size() > 0) {
        String text = chunks.get(chunks.size() - 1);
        label.setText(text);
    }
}

Приведенный выше код работает, но моя проблема (или, точнее, мое сомнение) заключается в следующем:

Вышеуказанная рабочая задача Swing является анонимным внутренним классом, поэтому она может получить доступ к полю label.

Но что, если я хочу сделать рабочий класс свинга не внутренним классом? Должен ли я передать label в качестве аргумента конструктору рабочего класса Swing, чтобы метод process () мог получить к нему доступ.

Или есть другой способ?

Какой подход использует другой разработчик для обновления компонентов пользовательского интерфейса из результата рабочего класса Swing, когда рабочий класс Swing не является внутренним классом?

1 Ответ

4 голосов
/ 28 апреля 2010

Но что, если я хочу сделать качели рабочий класс не внутренний класс. Должен Мне нужно передать метку в качестве аргумента конструктор рабочего класса свинг так что метод process () может доступ.

Это прекрасно. Из документации SwingWorker :

class PrimeNumbersTask extends 
    SwingWorker<List<Integer>, Integer> {
        PrimeNumbersTask(JTextArea textArea, int numbersToFind) { 
            //initialize 
        }

        @Override
        public List<Integer> doInBackground() {
            while (! enough && ! isCancelled()) {
                number = nextPrimeNumber();
                publish(number);
                setProgress(100 * numbers.size() / numbersToFind);
            }
        }
        return numbers;
    }

    @Override
    protected void process(List<Integer> chunks) {
        for (int number : chunks) {
            textArea.append(number + "\n");
        }
    }
}

JTextArea textArea = new JTextArea();
final JProgressBar progressBar = new JProgressBar(0, 100);
PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
task.addPropertyChangeListener(
    new PropertyChangeListener() {
        public  void propertyChange(PropertyChangeEvent evt) {
            if ("progress".equals(evt.getPropertyName())) {
                progressBar.setValue((Integer)evt.getNewValue());
            }
        }
    });

task.execute();

Обратите внимание на конструктор PrimeNumbersTask(JTextArea textArea, int numbersToFind). Они передают JTextArea для обновления.

...