Terminate running threads on JFrame close

16,351

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 the JFrame.

  • 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);
Share:
16,351
J.Olufsen
Author by

J.Olufsen

Passion for crafting state of the art software that makes an impact

Updated on June 13, 2022

Comments

  • J.Olufsen
    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 after JFrame.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?

  • Hovercraft Full Of Eels
    Hovercraft Full Of Eels almost 12 years
    This 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.