我有已经使用多年的代码,今天早上我注意到任务完成后没有调用属性更改。我已将 Swing Worker 设置为内部类,并在 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。在类(class)中,我添加了一个完成例程,当 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 处的断点被击中,但没有传递属性更改通知。 (我放置完成例程的唯一目的是验证 Swing 工作人员是否知道它已完成。)
我查看了文档,我没有看到我必须手动触发某种属性更改,所以我真的非常卡住,并且希望另一双眼睛能告诉我我犯了什么愚蠢的错误.
谢谢, 宜兰
最佳答案
事实证明我的 Java 已损坏。删除 JDK 1.6 并从存储库重新安装它还不够好。
我在 Netbeans 中到 1.6 的链接已损坏,我还必须重新安装 Netbeans(在此过程中转到 7.3.1)。 Netbeans 不会将 JDK 1.6 存储库识别为有效,因此我必须转到 Oracle 并获取原始版本。 Netbeans 识别了原始版本,我上面报告的问题不再是问题。
我删除了 void done() 例程,因为它除了放置断点的地方之外没有任何用途。这样的代码就可以了。感谢您的帮助。
关于java - 在 Swing worker 属性(property)变化没有被称为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18041687/