Martin
Martin

Reputation: 277

How do I run a terminate command on JFrame exit?

I know the basics behind trying to write code that terminates a thread, but I've run into a bit of a problem.

I've got a JButton in a JFrame GUI that launches the simulation I'm trying to animate. It is called in the ActionPerformed code of the JButton by

new AnswerWorker().execute();

The AnswerWorker class, in turn, extends SwingWorker so that the animation frame can be drawn while the GUI is still active.

public class AnswerWorker extends SwingWorker<String, Integer> {
    protected String doInBackground() throws Exception
    {
        Threading threading = new Threading();
    return null;
    }
protected void done()
{
try {
    JOptionPane.showMessageDialog(InputGUI.this, AMEC.unsuccesfulpercentage + "% of iterations had trucks that had to sleep over");
    AMEC.unsuccesfulpercentage = 0;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

}

}

To create a way of stopping the simulation thread, I created the class Threading, that calls the function that runs the simulation.

public class Threading extends Thread {

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
    try {
        AMEC.runsimulation();
    } catch (IOException ex) {
        Logger.getLogger(InputGUI.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InterruptedException ex) {
        Logger.getLogger(InputGUI.class.getName()).log(Level.SEVERE, null, ex);
    }
        }
    return;
    }
}

Now, in the runsimulation() function, I initialize a JFrame, and I want to terminate the thread running the simulation if the JFrame is closed by clicking on its close button. How do I do this?

EDIT: all of the above code is called in a file InputGUI.java that contains all my GUI elements. The runsimulation function is in my main project file, AMEC.java

Upvotes: 1

Views: 199

Answers (2)

Typo
Typo

Reputation: 1900

You could override the dispose() method on the JFrame to include a call to stop the thread

@Override
dispose(){
   stopThread();
   super.dispose();
}

Upvotes: 1

mKorbel
mKorbel

Reputation: 109813

How do I run a terminate command on JFrame exit?

  • add WindowListener to JFrame, from windowClosing event you have to call JFrame.setVisible(false) and then to call SwingWorker

  • after SwingWorker ended to terminate current JVM, to show a JOptionPane in the case that any exception raised, or to show JFrame again back to screen, required to change DefaultCloseOperation, to HIDE_ON_CLOSE

Upvotes: 1

Related Questions