JFrame关闭后如何执行操作?

时间:2015-08-17 13:26:29

标签: java swing jframe

我需要在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。

3 个答案:

答案 0 :(得分:2)

您可以将侦听器添加到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
    }
});

答案 1 :(得分:0)

如果要在关闭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());
}

答案 2 :(得分:0)

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

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

唯一的问题是如果你不想要模态行为 - 如果你不希望在显示子窗口时禁用父/调用窗口 - 那么你将不得不使用非带有WindowListener的模态JDialog窗口。