如何在SwingWorker的doInBackground()中停止一个被调用的静态方法

时间:2015-11-06 16:29:24

标签: java swing swingworker

我有一个名为Task1的SwingWorker,

class Task1 extends SwingWorker<Void, Void> {
        @Override
        public void doInBackground() {
            String[] args = {};
            try {
                FeatureSetBuilder.main(args); //<---It is a static method


            } catch (Exception e1) {
                e1.printStackTrace();
            }

            return null;
        }
        public void done() {

            UISettings.FP_GENERATOR_DIALOG_2.cancelButton.setEnabled(true);
            loadingDialog.progressBar.setIndeterminate(false);
            loadingDialog.setVisible(false);
        }
    }

我有一个执行Task1的按钮,

         public void actionPerformed(ActionEvent e) {
                System.out.println("FeatureSetBuilder - Start");
                String[] args = {};
                try {
                    task1 = new Task1();
                    task1.execute();
                    loadingDialog.popOut(task1);
                    task1.cancel(true);



                } catch (Exception e1) {
                    e1.printStackTrace();
                }
                System.out.println("FeatureSetBuilder - Finished");

            }

单击此按钮时,将弹出带有进度条的对话框,指示FeatureSetBuilder.main(args)方法正在运行。当task1完成时,将调用done()方法并关闭该对话框。

工作正常。

我想在该对话框中添加一个Cancel按钮,以便用户可以随时终止task1。

这是我的取消按钮,

 cancelButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Stop the current SwingWorker");
                    task.cancel(true);
                    setVisible(false);
                }
            });

当我按下取消按钮时,任务1似乎被终止为&#34; FeatureSetBuilder - 已完成&#34;打印出来。但是,静态方法FeatureSetBuilder.main(args)仍在运行。

1 个答案:

答案 0 :(得分:3)

您的doInBackground方法应定期检查任务是否已取消。来自SwingWorker class'javadoc的示例:

@Override
public List<Integer> doInBackground() {
    while (! enough && ! isCancelled()) {
            number = nextPrimeNumber();
            publish(number);
            setProgress(100 * numbers.size() / numbersToFind);
        }
    }
    return numbers;
}

我真的建议您阅读SwingWorker及相关类中所有类/方法的javadoc。 EventDispatchThread相关问题可能非常棘手。