Java JFrame关闭后如何执行操作?

Java JFrame关闭后如何执行操作?,java,swing,jframe,Java,Swing,Jframe,我需要在JFrame关闭后执行一个操作,我有这部分代码,但这不起作用 有人能告诉我这里应该做什么改变吗 private void changeDefaults(){ Thread changeDefaultsThread = new Thread(new Runnable(){ public void run(){ Change ch = new Change(); ch.setVisible(true);

我需要在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)
并覆盖窗口关闭

 @Override
 public void windowClosing


如果要在关闭JFrame时执行操作,只需附加WindowListener(扩展WindowAdapter,以便不需要实现所有WindowListener方法):

只需编写希望执行的代码,而不是System.out.println

更新:如果您想访问另一个帧,您应该按照上面的建议将其作为参数传递,或者您也可以使用类似以下内容在活动帧中进行迭代:

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

我很惊讶没有人提到最简单的解决方案:不要使用JFrame。实现此行为的最佳工具(显示子窗口并在其关闭后立即执行操作)是使用模态对话框窗口,如JDialog或JOptionPane。JDialog设置代码与JFrame非常相似,唯一的例外是它使用不同的构造函数,应该将父窗口传递给它,并且它使用默认关闭操作的子集

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


唯一的问题是,如果您不希望模态行为——如果您不希望在显示子窗口时禁用父/调用窗口——那么您必须使用带有WindowListener的非模态JDialog窗口。

关于此解决方案,我有一个问题。问题是,我不知道如何从第二个调用主框架的方法。您可以使用构造函数将主框架的实例传递给第二个,然后从windowClosing中调用。这是什么意思,它不起作用?会发生什么?错误消息是什么?可能帧有关闭操作,导致VM在帧关闭时结束。为了更快地获得更好的帮助,请发布一个or。
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");
            }
        });
    }
}
Frame[] frames = Frame.getFrames();
for (Frame frame: frames) {
    System.out.println(frame.getTitle());
}