Java 如何捕获JFrame';s关闭按钮单击事件?
我想在单击JFrame标题栏的红色关闭按钮时调用一个方法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,然后在下面添
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。