JFrame关闭后如何执行动作?

How to perform action after JFrame is closed?

我需要在 JFrame 关闭后执行一个操作,我有这部分代码,但这不起作用。

谁能告诉我这里应该改变什么?

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

更改是我为另一个操作打开的 JFrame。

您可以将侦听器添加到您的 JFrame

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

并覆盖 windowClosing

 @Override
 public void windowClosing

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

如果你想在关闭JFrame时执行一个动作,你只需要附加一个WindowListener(扩展WindowAdapter这样你就不需要实现所有的WindowListener方法):

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");
            }
        });
    }
}

而不是 System.out.println,只需编写您想要执行的代码即可。

更新:如果你想访问另一个框架,你应该按照上面的建议将它作为参数传递,或者你也可以使用类似这样的方法遍历活动框架:

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

我很惊讶没有人提到最简单的解决方案:不要使用 JFrame。这种行为的最佳工具——显示子 window 并在它关闭后立即执行某些操作——是使用模态对话框 window,例如 JDialog 或 JOptionPane。 JDialog 设置代码 非常 类似于 JFrame 的代码,不同之处在于它使用不同的构造函数,并且应该将父 window 传递给它,并且它使用默认关闭操作的子集。

如果您使用模态对话框,则程序流在对话框显示后立即在调用代码中停止(想想 JOptionPane 的操作方式),然后在调用后立即从现场恢复 setVisible(true) 在对话框关闭后出现在对话框上。

唯一的问题是,如果您不想要模态行为——如果您不希望 parent/calling window 在子 window 显示时被禁用-- 那么你将不得不使用非模态 JDialog window 和 WindowListener。