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,但是当我尝试给它一个 nameinitWorker时,它​​需要是 final 以便计时器可以引用它。但是 SwingWorker 本身也需要引用计时器,因此计时器也需要是最终的。

所以我想我设法在两个需要彼此的最终变量之间建立了依赖关系,我该如何解决这个问题?

问候。

4

1 回答 1

1

您不必ActionListener在创建时添加。您可以只传递nullTimer构造函数ActionListener然后使用addActionListener.

于 2013-05-18T21:50:28.367 回答