Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在swing worker Property中更改为';不要被叫_Java_Swing_Swingworker_Propertychangelistener - Fatal编程技术网

Java 在swing worker Property中更改为';不要被叫

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

我使用了多年的代码,今天早上我注意到任务完成时没有调用属性更改。我已经将swing worker设置为一个内部类,并在字符串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++;
    }
}
受保护类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开始时,我收到了一条开始的消息。由于如此专注于“完成”的信息,我已经忘记了“开始”。我都没有上这台机器,但我的代码显然是正确的。现在我只需要找出这台机器出了什么问题。乐趣和游戏。。。。。