2

匿名の SwingWorker をキャンセルしようとすると、奇妙な依存関係に遭遇しました。私の現在のコード:

private static void init() {
    if (connected) {
        return;
    }
    //final SwingWorker<Void, Void> initWorker;
    final Timer noConnectionTimer = new Timer(5000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //initWorker.cancel(true);
            waitObject.setTimedOut(true);
            connected = false;
            waitObject.process();
        }
    });
    new SwingWorker<Void, Void>() {
        @Override
        public Void doInBackground() {
            noConnectionTimer.setRepeats(false);
            noConnectionTimer.start();
            cachedInstance = new Network(Config.HOST_NAME, Config.HOST_PORT);
            if (connected) {
                noConnectionTimer.stop();
                new Thread(cachedInstance).start();
                waitObject.setTimedOut(false);
                waitObject.process();
            }
            return null;
        }
    }.execute();        
}

検証したい最初の仮定:

new Network(Config.HOST_NAME, Config.HOST_PORT)SwingWorker を強制終了 (キャンセル) することで、コードを強制終了できます。

したがって、私の仮定が正しいと仮定すると、匿名の SwingWorker をキャンセルしたいのですが、 name を付けようとするinitWorkerと、タイマーが参照できるように final にする必要があります。ただし、SwingWorker 自体もタイマーを参照する必要があるため、タイマーも final である必要があります。

それで、お互いを必要とする 2 つの最終変数の間に依存関係を作成できたと思います。これを修正するにはどうすればよいですか?

よろしく。

4

1 に答える 1

1

作成時に を追加する必要はありませんActionListener。のコンストラクターに渡しnull、その後に.TimerActionListeneraddActionListener

于 2013-05-18T21:50:28.367 に答える