在SwingWorker上使用done方法或更改侦听器更好吗?

时间:2015-02-06 13:19:49

标签: java swing user-interface swingworker

我有一个任务,当完成它更新一个摇摆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();
    }
}

在我的情况下,提高效率并不是必需的,我要求更多正确的代码编写。

1 个答案:

答案 0 :(得分:6)

  

在SwingWorker上使用done方法或更改侦听器会更好吗?

一般来说,两种方式都是正确和等效的。

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

此外,使用侦听器可以减少SwingWorker和GUI组件之间的耦合:它不知道后台线程完成后会发生什么,并且没有问题。通过重写done()方法,这将不再适用。

要做的一件重要事情 - 在监听StateValue.DONE或覆盖done()方法时 - 是调用get()方法来捕获和处理在{期间可能抛出的任何异常{1}}处理。请参阅与此相关的this Q&A

其余的没有重大区别。我只是为了扩展性而与听众一起去。

更新

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