【问题标题】:How to stop a called static method in doInBackground() of SwingWorker如何在 SwingWorker 的 doInBackground() 中停止调用的静态方法
【发布时间】:2016-02-07 20:50:06
【问题描述】:

我有一个名为 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() 将被调用并关闭该对话框。

效果很好。

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

这是我的取消按钮,

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

当我按下取消按钮时,任务 1 似乎被终止,因为“FeatureSetBuilder - Finished”被打印出来。但是,静态方法 FeatureSetBuilder.main(args) 仍在运行。

【问题讨论】:

  • 这与 Swing 几乎没有关系,而与 -- "how do I stop running Java code?" 首先我要做的不是运行另一个类的 main 方法,而是使代码更符合 OOP .接下来,我将研究一些通知机制,以允许任何进程要求正在运行的代码完全停止自身。正如预期的那样,魔鬼将在细节中。

标签: java swing swingworker


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多