【问题标题】:Java Swing adding Action Listener for EXIT_ON_CLOSEJava Swing 为 EXIT_ON_CLOSE 添加动作监听器
【发布时间】:2013-04-24 03:21:52
【问题描述】:
我有一个简单的 GUI:
public class MyGUI extends JFrame{
public MyGUI(){
run();
}
void run(){
setSize(100, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// maybe an action listener here
}
}
我想打印这条消息:
System.out.println("Closed");
当 GUI 关闭时(按下 X 时)。我该怎么做?
【问题讨论】:
标签:
java
swing
jframe
windowlistener
【解决方案1】:
窗口事件:
有完整的程序,希望对你有帮助。
公共类 FirstGUIApplication {
public static void main(String[] args) {
//Frame
JFrame window = new JFrame();
//Title:setTitle()
window.setTitle("First GUI App");
//Size: setSize(width, height)
window.setSize(600, 300);
//Show: setVisible()
window.setVisible(true);
//Close
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
JOptionPane.showConfirmDialog(null,"Are sure to close!");
}
@Override
public void windowOpened(WindowEvent e) {
super.windowOpened(e);
JOptionPane.showMessageDialog(null, "Welcome to the System");
}
});
}
}
【解决方案2】:
在 JFrame 的构造函数中编写此代码:
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
System.out.println("Uncomment following to open another window!");
//MainPage m = new MainPage();
//m.setVisible(true);
e.getWindow().dispose();
System.out.println("JFrame Closed!");
}
});
【解决方案3】:
另一种可能性是从Window 类中覆盖dispose()。这减少了发送的消息数量,并且如果默认关闭操作设置为DISPOSE_ON_CLOSE 也可以工作。
具体来说就是添加
@Override
public void dispose() {
System.out.println("Closed");
super.dispose();
}
到你的班级MyGUI。
注意:不要忘记调用super.dispose(),因为这会释放屏幕资源!
【解决方案4】:
试试这个。
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
System.out.println("Closed");
e.getWindow().dispose();
}
});