Java 如何捕获JFrame';s关闭按钮单击事件?

Java 如何捕获JFrame';s关闭按钮单击事件?,java,swing,jframe,windowlistener,Java,Swing,Jframe,Windowlistener,我想在单击JFrame标题栏的红色关闭按钮时调用一个方法confirmExit() 我如何捕获该事件 如果用户选择不继续,我还希望阻止窗口关闭。覆盖windowClosing方法 public void windowClosing(WindowEvent e) 当窗口处于关闭过程中时会调用它。此时可以覆盖关闭操作 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 同样有效。首先创建一个名为frame的JFrame,然后在下面添

我想在单击JFrame标题栏的红色关闭按钮时调用一个方法
confirmExit()

我如何捕获该事件


如果用户选择不继续,我还希望阻止窗口关闭。

覆盖windowClosing方法

public void windowClosing(WindowEvent e)
当窗口处于关闭过程中时会调用它。此时可以覆盖关闭操作

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
同样有效。首先创建一个名为frame的JFrame,然后在下面添加此代码

import javax.swing.JOptionPane;
import javax.swing.JFrame;

/*Some piece of code*/
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});
如果您还想阻止窗口关闭,除非用户选择“是”,您可以添加:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
试试这个:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
它会起作用。

这可能会起作用:

jdialog.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
        System.out.println("jdialog window closed event received");
    }

    public void windowClosing(WindowEvent e) {
        System.out.println("jdialog window closing event received");
    }
});

来源:

这是我放在菜单选项中的内容,我在
JFrame
上做了一个按钮来显示另一个
JFrame
。我只想看到新的框架,而不是破坏它背后的框架。我最初隐藏了第一个
JFrame
,而新的一个变为可见。在关闭新的
JFrame
后,我处理了它,随后又执行了一个操作,使旧框架再次可见

注:以下代码根据Ravinda的答案展开,
ng
是一个
JButton

ng.addActionListener((ActionEvent e)->{
setVisible(假);
JFrame j=新JFrame(“名称”);
j、 setVisible(真);
j、 addWindowListener(新java.awt.event.WindowAdapter(){
@凌驾
公共无效窗口关闭(java.awt.event.WindowEvent){
setVisible(真);
}
});
});

但这不会像OP所希望的那样执行
confirmExit()
方法。它会做同样的事情。不,我不想简单地关闭程序。我想在它发生之前做点什么。“我想做的是在点击[X]时调用…
confirmExit()
。”前面的注释与OQ无关。这恰恰相反,添加
frame.setDefaultCloseOperation(关闭时不做任何事情)
使用
confirmExit
进行控制。如果用户关闭应用程序(例如,在Mac上点击Cmd+Q),这是否有效?实现此方法的类是否必须声明
实现WindowListener
,才能使此代码正常工作?如果是这样的话,最好在答案中包含这一点。否则,这是一个优雅的解决方案。@brandaemon如果您将这行代码添加到main()方法“System.setProperty(“apple.eawt.quitStrategy”,“CLOSE_ALL_WINDOWS”);的顶部,则在mac上按下Cmd+Q时,它将调用windowListener。