【发布时间】: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