我需要在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。
答案 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窗口。