我在用 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);
    }
}

以上代码有效,但我的问题(或更具体的是,我的疑问)如下:

上面的摇摆工作者任务是一个匿名的内部类,因此可以访问 label 场地。

但是,如果我想让Swing Worker类成为非界限班级怎么办。我应该通过 label 作为向Swing Worker类的构造函数的参数,以便Process()方法可以访问。

还是还有其他方法?

当Swing Worker类不是内部类时,其他开发人员遵循哪种方法来更新Swing Worker类结果的UI组件?

有帮助吗?

解决方案

但是,如果我想让Swing Worker类成为非界限班级怎么办。我是否需要将标签作为参数传递给Swing Worker类的构造函数,以便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 更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top