我第一次使用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工作者类的结果?
答案 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
更新。