1

我有多年来一直在使用的代码,今天早上我注意到任务完成后没有调用属性更改。我已经将摇摆工人设置为内部类,并在 String propertyName = evt 上放置了一个断点......它从未达到断点。

void loadData() {
    work2 = new bkgdLoadData();
    work2.addPropertyChangeListener(new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if( propertyName.equals("state")) {
                SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();
                if( state == SwingWorker.StateValue.DONE) {
                    work2 = null;
                }
            }
        }
    });
    work2.execute();
}

您可以看到我在任务完成时将对象 work2 设置为 null,现在它不再设置为 null。在课堂上,我添加了一个完成的例程,它会在 doinbackground 完成时触发。令我困惑的是为什么没有触发属性更改侦听器。一定在我不注意的情况下发生了一些变化。

protected class bkgdLoadData extends SwingWorker<Integer, Object> {
    @Override
    protected Integer doInBackground() {
        switch(bkgdMode) {
            case 0:
                doRead();
                break;

            case 1:
                doWrite();
                break;

            case 2:
                runRobot();
                break;
        }
        return 0;
    }

    @Override
    protected void done() {
        int i=0;
        i++;
    }
}

done 处的断点被命中,但没有传递属性更改通知。(我放置 done 例程的唯一目的是验证摇摆工人是否知道它已经完成。)

我查看了文档,我没有看到我必须手动触发某种属性更改,所以我真的,真的卡住了,希望另一双眼睛告诉我我犯了什么愚蠢的错误。

谢谢,伊兰

4

1 回答 1

0

原来我的 Java 已损坏。删除 JDK 1.6 并从存储库重新安装它还不够好。

我在 Netbeans 中到 1.6 的链接损坏了,我也不得不重新安装 Netbeans(在此过程中转到 7.3.1)。Netbeans 不会将存储库 JDK 1.6 识别为有效,因此我不得不去 Oracle 并获取原始版本。Netbeans 认出了原来的问题,我上面报告的问题不再是问题。

我删除了 void done() 例程,因为它除了放置断点之外没有其他用途。这样的代码是可以的。谢谢您的帮助。

于 2013-08-06T08:48:51.683 回答