我第一次使用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.
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进行更新.