Java -Swingworker- process()方法中的问题
-
02-10-2019 - |
题
我在用 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
更新。
不隶属于 StackOverflow