Trying to stop swingworker

2019-01-27 10:35发布

问题:

I have a custom JDialog that pops up when my SwingWorker thread fires up. The dialog just has a JProgressbar and a Button (cancel button). I am trying to figure out how to cancel my SwingWorker, but am having no luck. I think I am on the right path though. I wrote a cancel method, now I just need to figure out how to call it when the button is pushed. Code is below...

            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();

回答1:

Your cancel button should call the SwingWorker#cancel method

final SwingWorker worker = ...;

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

In your worker, you have to make sure to check the cancel flag

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

Note that you need to create the worker before you create your ActionListener



回答2:

As explained in the official documentation, you need to check isCancelled() in your SwingWorker callback method.



回答3:

You could call

worker.cancel(true);

in your button action listener?



回答4:

You should call

worker.cancel(true); //this will set the cancel flag of the worker

Then, when you invoke isCancelled() this will return true. So, you Can check this state in your loop