Java - SwingWorker - process()方法中的问题

时间:2010-04-28 19:04:19

标签: java swing swingworker edt

我第一次使用javax.swing.SwingWorker

我想从swing工作人员发布的中期结果中更新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字段。

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

或者还有其他方法吗?

当swing worker类不是内部类时,其他开发人员遵循什么方法来更新swing工作者类的结果?

1 个答案:

答案 0 :(得分:4)

  

但是,如果我想要挥杆怎么办?   工人阶级非内部阶级。应该   我需要将label作为参数传递给   摇摆工人阶级的构造者   这样process()方法就可以了   访问。

这很好。来自SwingWorker documentation

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更新。