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

我第一次使用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 worker任务是一个匿名内部类,因此它可以访问label字段.

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

或者还有其他方法吗?

当Swing Worker类不是内部类时,其他开发人员会采用什么方法从Swing Worker类的结果中更新UI组件?

解决方法:

But what if I want to make the swing
worker class a non-inner class. Should
I need to pass label as an argument to
the constructor of swing worker class
so that the process() method can
access.

很好从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进行更新.

上一篇:【贪心】选择不相交区间问题


下一篇:java – 为什么要在EDT线程外调用SwingUtils.invokeAndWait()方法?