Java 在swing worker Property中更改为';不要被叫
我使用了多年的代码,今天早上我注意到任务完成时没有调用属性更改。我已经将swing worker设置为一个内部类,并在字符串properyName=evt上设置了一个断点。。。。。而且它从来没有达到临界点Java 在swing worker Property中更改为';不要被叫,java,swing,swingworker,propertychangelistener,Java,Swing,Swingworker,Propertychangelistener,我使用了多年的代码,今天早上我注意到任务完成时没有调用属性更改。我已经将swing worker设置为一个内部类,并在字符串properyName=evt上设置了一个断点。。。。。而且它从来没有达到临界点 void loadData() { work2 = new bkgdLoadData(); work2.addPropertyChangeListener(new PropertyChangeListener() { @Override publ
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++;
}
}
受保护类bkgdLoadData扩展SwingWorker{
@凌驾
受保护整数doInBackground(){
开关(bkgdMode){
案例0:
多里德();
打破
案例1:
道瑞特();
打破
案例2:
runRobot();
打破
}
返回0;
}
@凌驾
受保护的void done(){
int i=0;
i++;
}
}
命中了“完成”处的断点,但未传递属性更改通知。(我设置“完成”例程的唯一目的是验证摇摆工人是否知道已完成。)
我看了文档,没有发现我必须手动启动某种属性更改,所以我真的,真的被卡住了,希望能有另一双眼睛告诉我我犯了什么愚蠢的错误
谢谢,
宜兰结果是我的Java被破坏了。删除JDK1.6并从存储库中重新安装它还不够好 我在Netbeans中与1.6的链接被破坏了,我也不得不重新安装Netbeans(在这个过程中,我将转到7.3.1)。Netbeans无法识别存储库JDK1.6是否有效,因此我不得不去Oracle获取原始版本。Netbeans认识到了最初的问题,我上面报告的问题不再是问题
我删除了void done()例程,因为它除了一个放置断点的位置之外没有其他用途。代码本身是可以的。感谢您的帮助。您应该阅读Java Swing教程,这是解决您的问题的最佳来源。我可以看到正在触发
PropertyChange
事件。你需要确定一些额外的事情。1-doInBackground
被称为begin(我知道听起来很愚蠢),而propertyChange
是/不是。例如添加一些System.out.println
语句,至少验证是否调用了begin方法。另外,SwingWorker
使用守护进程线程,这意味着即使SwingWorker
仍在运行,JVM也将退出:a)完成中的代码不执行任何操作:本地字段递增。。。b) 请学习java命名约定并坚持下去。我知道我正在递增一个局部变量。唯一的目的是有一条线,我可以把一个断点。我在doInBackground的返回0上放置了一个断点,在done例程中放置了另一个断点。我看到它在后台的do中点击了return,然后点击了done()。唯一没有发生的事就是发动一场财产变更。同样,我做的第一件事就是重新阅读文档。我做了我唯一能想到的另一件事——在另一台机器上试用。在我的笔记本电脑上,它可以很好地启动。在我的消息中,我尝试了doInBackground和done返回时的两个断点,以及PropertyChange中的一个断点。当它在doInBackground开始时,我收到了一条开始的消息。由于如此专注于“完成”的信息,我已经忘记了“开始”。我都没有上这台机器,但我的代码显然是正确的。现在我只需要找出这台机器出了什么问题。乐趣和游戏。。。。。