0

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();
mKorbel
  • 109,525
  • 20
  • 134
  • 319
yellowman
  • 15
  • 1
  • 5

4 Answers4

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

Robin
  • 36,233
  • 5
  • 47
  • 99
  • This works! I have been beating my head on this for a week trying to get the cancel button to function correctly! Thank you. – yellowman Dec 06 '13 at 18:33
  • Afaik, you should never need to check `isCancelled()` inside `doInBackground()` because it will exit the background thread as soon as `cancel(true)` is called. You need check `isCancelled()` before calling `get()` to avoid an `InterruptedException` in the `done()` method. – ryvantage Dec 07 '13 at 18:11
0

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

Domi
  • 22,151
  • 15
  • 92
  • 122
0

You could call

worker.cancel(true);

in your button action listener?

Joe Birch
  • 371
  • 2
  • 7
  • This was what I was initially trying, but when I add that to my ActionListener it says that it cannot find symbol worker. – yellowman Dec 06 '13 at 16:25
0

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

Keerthivasan
  • 12,760
  • 2
  • 32
  • 53
  • I added worker.cancel(true); to my listener and this seemed to work after I made my SwingWorker final. When I changed the condition of my while loop to be while(!worker.isCancelled()) I get an error that says that variable might not have been initialized. Any ideas? – yellowman Dec 06 '13 at 17:16
  • isCancelled() would be enough, since it is an anonymous class definition. Updated my answer as well. thanks – Keerthivasan Dec 06 '13 at 17:51