gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:52 25 4
gpt4 key购买 nike

我是第一次使用 javax.swing.SwingWorker

我想根据 swing worker 发布的中期结果更新一个 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 字段。

但是如果我想让 swing worker 类成为非内部类怎么办?我是否需要将 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 - SwingWorker - process() 方法中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2732387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com