Search code examples
javamultithreadingswingswingworker

Trying to stop swingworker


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

Solution

  • 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