【问题标题】:in swing worker propertychange isn't being called在摇摆工人财产变化没有被调用
【发布时间】:2013-08-04 09:50:22
【问题描述】:

我有多年来一直在使用的代码,今天早上我注意到任务完成后没有调用属性更改。我已经将摇摆工人设置为内部类,并在 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 例程的唯一目的是验证摇摆工人是否知道它已完成。)

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

谢谢, 宜兰

【问题讨论】:

  • 您应该阅读 Java Swing 教程,这是解决问题的最佳来源。
  • 我可以看到PropertyChange 事件被触发。你需要确保一些额外的事情。 1- doInBackground 开始被调用(我知道这听起来很愚蠢)并且 propertyChange 是/不是。例如。添加一些System.out.println 语句以至少验证方法是否已开始调用。另外,SwingWorker 使用守护线程,这意味着即使SwingWorker 仍在运行,JVM 也会退出
  • 不相关:a) done 中的代码什么都不做:本地字段递增 ... b) 请学习 java 命名约定并遵守它们
  • 我知道我正在增加一个局部变量。唯一的目的是有一条线,我可以在其中放置一个断点。我在 doInBackground 的 return 0 和 done 例程中设置了一个断点。我看到它在后台执行返回,然后执行完成()。唯一没有发生的事情是触发属性更改。同样,我做的第一件事就是重新阅读文档。
  • 我只做了我能想到的另一件事——在另一台机器上尝试。在我的笔记本电脑上,它很好地开火。在我的消息中,我在 doInBackground 的返回处尝试了 2 个断点并完成,以及 PropertyChange 中的一个。一旦它在 doInBackground 中启动,我就会收到一条 STARTED 消息。如此专注于 DONE 消息,我忘记了 STARTED。我也没有上这台机器,但我的代码显然是正确的。现在我只需要弄清楚这台机器出了什么问题。乐趣和游戏.....

标签: java swing swingworker propertychangelistener


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多