Martin Plávek
Martin Plávek

Reputation: 335

How to perform action after JFrame is closed?

I need to perform an action after the JFrame is closed and I have this part of code for it, but this doesn't work.

Could anyone please advise what should be change here?

private void changeDefaults(){
    Thread changeDefaultsThread = new Thread(new Runnable(){
        public void run(){
            Change ch = new Change();
            ch.setVisible(true);
            ch.setListeners();
            ch.defaultInput();
            while(ch.isActive()){
                System.out.println("active");
            }
            updateDefaults();
            }
    });
    changeDefaultsThread.start();
}   

Change is the JFrame I am opening for another action.

Upvotes: 2

Views: 2913

Answers (3)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

I'm surprised no one has mentioned the simplest solution: don't use a JFrame. The best tool for this behavior -- displaying a child window and doing something immediately after it has closed -- is to use a modal dialog window such as a JDialog or JOptionPane. The JDialog set up code is very similar to that of the JFrame, with an exception being that it uses different constructors, and should have the parent window passed into it, and it uses a subset of the default close operations.

If you use a modal dialog, then program flow is halted in the calling code immediately after the dialog has been displayed (think of how a JOptionPane operates), and then immediately resumes from the spot after calling setVisible(true) on the dialog once the dialog has been closed.

The only bugaboo is that if you don't want modal behavior -- if you don't want the parent/calling window to be disabled while the child window is displayed -- then you'll have to use a non-modal JDialog window with a WindowListener.

Upvotes: 0

Henri Benoit
Henri Benoit

Reputation: 725

If you want to perform an action when closing a JFrame, you just need to attach a WindowListener (extending WindowAdapter so that you do not need to implement all WindowListener methods):

import javax.swing.*;

public class AfterJFrameClose {

    public static void main(String[] args) {
        JFrame frame = new JFrame("My frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setAlwaysOnTop(true);

        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                System.out.println("Frame closing");
            }
        });
    }
}

Instead of the System.out.println, just write the code you want to have executed.

Update: If you want to access another frame, you either should pass it as a parameter as suggested above or you can also iterate through active frames using something like this:

Frame[] frames = Frame.getFrames();
for (Frame frame: frames) {
    System.out.println(frame.getTitle());
}

Upvotes: 0

Garry
Garry

Reputation: 4533

You can add listener to your JFrame

frame.addWindowListener (new java.awt.event.WindowAdapter)

and override the windowClosing

 @Override
 public void windowClosing

frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        //do something
    }
});

Upvotes: 2

Related Questions