3

我是javax.swing.SwingWorker第一次使用。

我想JLabel从 swing worker 发布的中期结果中更新 a 如下:

publish("Published String");

现在要更新JLabel,我编写了以下代码:

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

上面的代码有效,但我的问题(或者更具体地说,我的疑问)如下:

上面的 swing worker 任务是一个匿名的内部类,因此它可以访问label字段。

但是,如果我想让摇摆工人阶级成为非内部阶级怎么办。我是否需要label作为参数传递给 swing worker 类的构造函数,以便 process() 方法可以访问。

或者有没有其他方法?

当 Swing 工作类不是内部类时,其他开发人员遵循什么方法从 Swing 工作类的结果更新 UI 组件?

4

1 回答 1

4

但是,如果我想让摇摆工人阶级成为非内部阶级怎么办。我是否需要将标签作为参数传递给 swing 工作类的构造函数,以便 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更新。

于 2010-04-28T19:20:49.727 回答