如何捕获 JFrame 的关闭按钮单击事件?

Posted

技术标签:

【中文标题】如何捕获 JFrame 的关闭按钮单击事件?【英文标题】:How to capture a JFrame's close button click event? 【发布时间】:2012-02-23 23:49:53 【问题描述】:

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

如何捕捉该事件?

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

【问题讨论】:

【参考方案1】:
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);

【讨论】:

【参考方案2】:

这是我作为菜单选项放置的,我在JFrame 上创建了一个按钮以显示另一个JFrame。我只想让新框架可见,而不是破坏它后面的框架。我最初隐藏了第一个 JFrame,而新的则变得可见。关闭新的JFrame 后,我将其处理掉,然后采取措施让旧的再次可见。

注意:以下代码扩展了 Ravinda 的答案,ngJButton

ng.addActionListener((ActionEvent e) -> 
    setVisible(false);
    JFrame j = new JFrame("NAME");
    j.setVisible(true);
    j.addWindowListener(new java.awt.event.WindowAdapter() 
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) 
            setVisible(true);
        
    );
);

【讨论】:

【参考方案3】:

这可能有效:

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");
    
);

来源:https://alvinalexander.com/java/jdialog-close-closing-event

【讨论】:

【参考方案4】:

试试这个:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

它会起作用的。

【讨论】:

【参考方案5】:
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

也可以。首先创建一个名为frame的JFrame,然后在下面添加这段代码。

【讨论】:

但这不会像 OP 所希望的那样执行 confirmExit() 方法 它做同样的事情 不,我不想简单地关闭程序。我想在事情发生之前做点什么。 “我要做的是在单击 [X] 时调用 ...confirmExit()。”而且之前的评论和OQ无关。 这个正好相反,加frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);就可以控制confirmExit了。【参考方案6】:

覆盖 windowClosing 方法。

public void windowClosing(WindowEvent e)

当窗口正在关闭时调用。此时可以覆盖关闭操作。

【讨论】:

如果用户关闭应用程序(例如,在 Mac 上按 Cmd + Q),这会起作用吗?实现此方法的类是否必须声明 implements WindowListener 才能使此代码正常工作?如果是这样,最好将其包含在答案中。否则,这是一个优雅的解决方案。 @brandaemon 如果将此行代码添加到 main() 方法的顶部“System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");"然后在mac上按下Cmd + Q时它会调用windowListener。

以上是关于如何捕获 JFrame 的关闭按钮单击事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在dojo Modaldialog中单击关闭按钮来捕获事件?

单击按钮关闭 JFrame [重复]

单击JFrame上的退出按钮需要关闭JFrame

groovy关闭JFrame窗口的方式与用户单击xclose窗口按钮的方式相同

DELPHI中如何使窗体的关闭按钮失效

Java - 关闭 JFrame 窗口时的消息