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