试图阻止swingworker

时间:2013-12-06 15:30:44

标签: java multithreading swing swingworker

我有一个自定义的JDialog,当我的SwingWorker线程启动时弹出。该对话框只有一个JProgressbar和一个Button(取消按钮)。我想弄清楚如何取消我的SwingWorker,但我没有运气。我想我现在正走在正确的道路上。我写了一个取消方法,现在我只需要弄清楚当按下按钮时如何调用它。代码如下......

            btn_Cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) 
                {
                   //trying to access cancel()
                }
             });

        SwingWorker worker = new SwingWorker<String, Void>() { 
        @Override
        protected String doInBackground() throws Exception {
                while (runLoad.getState() != Thread.State.TERMINATED &&      !isCancelled()) {
                    try {
                        synchronized (this) {
                            Thread.sleep(2000);
                        }
                    } catch (InterruptedException e){}
                }
                return null;
            }
        @Override
        public void done() {
                try {
                   get(); 
                } catch (InterruptedException | ExecutionException ex) {
                    JOptionPane.showMessageDialog(null,
                    "Somethings Wrong: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                }
              Progress.setVisible(false);
              Progress.dispose();
            }
        public void cancel(SwingWorker worker){
            worker.cancel(true);
         }
       };
       worker.execute();

4 个答案:

答案 0 :(得分:1)

您的取消按钮应调用SwingWorker#cancel方法

final SwingWorker worker = ...;

btn_Cancel.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    worker.cancel( true );
  }
});

在你的工人中,你必须确保检查取消标志

SwingWorker worker = new SwingWorker<String, Void>() { 
  @Override
  protected String doInBackground() throws Exception {
    while ( !isCancelled() ) {
      //do your stuff
    }
  }
}

请注意,您需要在创建ActionListener

之前创建工作人员

答案 1 :(得分:0)

正如in the official documentation所述,您需要在isCancelled()回调方法中查看SwingWorker

答案 2 :(得分:0)

你可以打电话

worker.cancel(true);
你的按钮动作监听器中的

答案 3 :(得分:0)

你应该致电

worker.cancel(true); //这将设置工作人员的取消标志

然后,当您调用isCancelled()时,这将返回true。那么你 可以在循环中检查这种状态