我有多年来一直使用的代码,今天早上我注意到任务完成时没有调用属性更改。我已经将swing工作者设置为内部类,我在String properyName = 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++;
}
}
已完成断点,但未传递任何属性更改通知。 (我把完成的例程用于验证摇摆工作者是否知道已完成。)
我查看了文档并且我没有看到我必须手动触发某种属性更改,所以我真的,真的卡住并会欣赏另一双眼睛告诉我我错误的是什么愚蠢的错误
谢谢, 伊兰
答案 0 :(得分:0)
原来我的Java已损坏。删除JDK 1.6并从存储库重新安装它是不够的。
我在Netbeans中对1.6的链接受到了破坏,我也不得不重新安装Netbeans(在此过程中转到7.3.1)。 Netbeans不会认为存储库JDK 1.6是有效的,所以我不得不去Oracle并获得原始版本。 Netbeans认识到原版,我上面报道的问题不再是问题。
我删除了void done()例程,因为除了放置断点之外没有任何其他目的。这样的代码是可以的。谢谢你的帮助。