如何捕获 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 的答案,ng
是 JButton
:
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中单击关闭按钮来捕获事件?