Java JFrame关闭后如何执行操作?
我需要在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);
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());
}