取消匿名SwingWorker

时间:2013-05-18 20:40:43

标签: java swing swingworker

在尝试取消匿名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();        
}

首先我希望得到验证:

我可以通过杀死(取消)SwingWorker来杀死new Network(Config.HOST_NAME, Config.HOST_PORT)代码。

因此,假设我的假设是正确的,我想取消匿名的SwingWorker,但是当我尝试给它命名initWorker时,它需要是最终的,以便计时器可以引用它。但是,SwingWorker本身也需要引用计时器,因此计时器也需要是最终的。

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

问候。

1 个答案:

答案 0 :(得分:1)

创建时不必添加ActionListener。您可以将null传递给Timer的{​​{3}},然后使用constructor添加ActionListener