java - 在 SwingWorker 上使用 done 方法还是更改监听器更好?

标签 java swing user-interface swingworker

我有一个任务,当它完成时更新一个 swing GUI 告诉它已经完成。我看到的是,您可以使用 done() 方法或附加一个 PropertyChangeListener 并监听对 done 状态的更改。

什么更好用,为什么?或者它们是一样的?

例如,这个:

public class Foo implements PropertyChangeListener {

    public void propertyChange(PropertyChangeEvent evt) {

        if ("state".equals(evt.getPropertyName())
                && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {

            this.updateTheGuiAndOtherThings();

        }

    }
}

或者这个:

public class W extends SwingWorker {

    protected Boolean doInBackground() throws Exception {...}

    protected void done() {
        otherClass.updateTheGuiAndOtherThings();
    }
}

在我的例子中没有必要更高的效率,我要求更多的是正确的代码编写。

最佳答案

Is it better to use done method or a change listener on SwingWorker?

一般来说这两种方式都是正确且等价的。

然而,使用 PropertyChangeListener 的主要优点是您可以将多个监听器附加到 SwingWorker,这允许您将任务拆分为小代码单元,而不是只有一个 done()代码块。例如,如果您必须更新多个 Swing 组件并且您希望保持这些更新紧密独立,这将很有用。

此外,使用监听器减少了 SwingWorker 和 GUI 组件之间的耦合:它不知道后台线程完成时会发生什么,但没关系。通过覆盖 done() 方法,这将不再成立。

当监听 StateValue.DONE 或覆盖 done() 方法时,一件重要的事情是调用 get()方法,以便捕获和处理在 doInBackground() 处理期间可能抛出的任何异常。参见 this Q&A与此有关。

其余的没有太大区别。我会选择听众只是为了可扩展性。

更新

根据下面@mKorbel 的评论,您可能还想看看这个主题:Is a swingWorker guaranteed to throw a state property change event on completion?甚至 recosinder 使用 SwingWorker。我个人没有遇到任何问题,但了解与此事的多线程性质相关的可能错误是件好事。

关于java - 在 SwingWorker 上使用 done 方法还是更改监听器更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28366733/

相关文章:

java - 当用户输入数据/删除文本时,在 TextField 中显示/消失默认文本

java - 如何制作可滚动的 JTable

java - Gradle:在我自己的任务中从导入的插件调用任务

java - 无法解析 Apache Camel Route 中的 .process

Java Swing FocusTraversalPolicy 问题

javascript - Electron 窗口标题需要一些时间来加载(加载前显示项目名称)

java - 将图像插入 JScrollPane 并将 JScrollPane 插入 JFrame

java - 内部类与静态嵌套类的 GC 性能下降

java - 从 URL 获取页面内容?

java - 清除 Swing 中按钮单击操作的文本字段