1

私は何年も使用してきたコードを持っていますが、今朝、タスクが完了したときにプロパティの変更が呼び出されていないことに気付きました。内部クラスとしてスイング ワーカーをセットアップし、String プロパティ名 = 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 のブレークポイントにヒットしましたが、プロパティの変更通知は配信されません。(私は、swing worker がそれが完了したことを知っていることを確認するためだけに、done ルーチンを置いています。)

私はドキュメンテーションを見ましたが、ある種のプロパティの変更を手動で開始する必要があることがわかりません。

ありがとう、イラン

4

1 に答える 1

0

私のJavaが壊れていることが判明しました。JDK 1.6 を削除してリポジトリから再インストールするだけでは十分ではありませんでした。

Netbeans の 1.6 へのリンクが壊れてしまい、Netbeans も再インストールする必要がありました (その過程で 7.3.1 に移行しました)。Netbeans はリポジトリ JDK 1.6 を有効なものとして認識しないため、Oracle に行って元のバージョンを取得する必要がありました。Netbeans はオリジナルを認識し、上で報告した問題はもはや問題ではありませんでした。

void done() ルーチンは、ブレークポイントを置く場所以外に目的がなかったので削除しました。コード自体はOKです。助けてくれてありがとう。

于 2013-08-06T08:48:51.683 に答える