Terminate running threads on JFrame close
Solution 1
Using JFrame.EXIT_ON_CLOSE
actually terminates the JVM (System.exit
). All running threads will automatically be stopped.
If you want to perform some action when a JFrame
is about to close, use a WindowListener
.
JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// close sockets, etc
}
});
Solution 2
You have to add a
WindowListener
to theJFrame
.Inside the
windowClosing
method, you can provide required code.
For example:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClosingFrame extends JFrame {
private JMenuBar MenuBar = new JMenuBar();
private JFrame frame = new JFrame();
private static final long serialVersionUID = 1L;
private JMenu File = new JMenu("File");
private JMenuItem Exit = new JMenuItem("Exit");
public ClosingFrame() {
File.add(Exit);
MenuBar.add(File);
Exit.addActionListener(new ExitListener());
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == 0) {
System.exit(1);
}
}
};
frame.addWindowListener(exitListener);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setJMenuBar(MenuBar);
frame.setPreferredSize(new Dimension(400, 300));
frame.setLocation(100, 100);
frame.pack();
frame.setVisible(true);
}
private class ExitListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == 0) {
System.exit(1);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ClosingFrame cf = new ClosingFrame();
}
});
}
}
Solution 3
You can set the default close operation on the JFrame
JFrame frame = new JFrame("My Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
J.Olufsen
Passion for crafting state of the art software that makes an impact
Updated on June 13, 2022Comments
-
J.Olufsen almost 2 years
How do I invoke extra operations when the user closes a
JFrame
window? I have to stop existing threads.As I understand it,
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
causes the frame to be closed and its thread to be stopped. Should threads be closed afterJFrame.EXIT_ON_CLOSE
?Client:
static boolean TERMINATE = false; public static void main(String[] args) { // some threads created while(true) { if(TERMINATE){ // do before frame closed break; } } } private static JPanel startGUI(){ JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel gui = new JPanel(); f.add( gui); f.setSize(500,500); f.setVisible(true); return gui; }
I need to close sockets the thread's working with. What is the best practice to do that?
-
trashgod almost 12 yearsSee also §12.8. Program Exit.
-
-
Hovercraft Full Of Eels almost 12 yearsThis is true if the user presses the window close icon at the top left of the JFrame, but isn't true if the JFrame closes by calling
dispose()
on it, not if a non-daemon thread is running.