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

发布于 2024-08-30 11:07:54 字数 686 浏览 7 评论 0原文

我是第一次使用 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 Worker 任务是一个匿名内部类,因此它可以访问 label 字段。

但是如果我想让摇摆工人阶级成为非内部阶级怎么办?我是否需要将 label 作为参数传递给 swing 工作类的构造函数,以便 process() 方法可以访问。

或者还有其他办法吗?

当 Swing Worker 类不是内部类时,其他开发人员采用什么方法从 Swing Worker 类的结果更新 UI 组件?

I am using javax.swing.SwingWorker for the first time.

I want to update a JLabel from the interim results published by the swing worker as follows:

publish("Published String");

Now to update the JLabel, I have coded the following:

process(List<String> chunks) {
    if (chunks.size() > 0) {
        String text = chunks.get(chunks.size() - 1);
        label.setText(text);
    }
}

The above code works but my problem(or to be more specific, my doubt) is as follows:

The above swing worker task is an annonymous inner class so it can access label field.

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.

Or Is there any other way?

What approach does other developer follow to update UI components from the swing worker class' result when the swing worker class is not an inner class?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ㄟ。诗瑗 2024-09-06 11:07:54

但是如果我想摇摆怎么办
工人阶级非内部阶级。应该
我需要将标签作为参数传递给
Swing工人阶级的构造者
这样 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 numberToFind)。他们通过 JTextArea 进行更新。

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.

That's perfectly fine. From the 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();

Notice the constructor PrimeNumbersTask(JTextArea textArea, int numbersToFind). They pass the JTextArea to update.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文