2012-02-01 156 views
66

当单击JFrame标题栏上的红色关闭按钮时,是否有某种方式“执行某些操作”?我想要做的是在单击按钮时调用一个名为confirmExit()的方法。到目前为止,我唯一的选择是让它无所作为,但我不想那样做。我该如何做到这一点?在JFrame上单击关闭按钮时执行某些操作

在此先感谢。

回答

107
import javax.swing.JOptionPane; 
import javax.swing.JFrame; 
/*Some piece of code*/ 
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
     if (JOptionPane.showConfirmDialog(frame, 
      "Are you sure to close this window?", "Really Closing?", 
      JOptionPane.YES_NO_OPTION, 
      JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){ 
      System.exit(0); 
     } 
    } 
}); 
+1

单击否时窗口仍然关闭。有没有办法阻止它? – WVrock 2014-12-06 18:05:18

+9

@WVrock'setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);' – 2014-12-06 19:53:24

+0

谢谢,它的工作原理。 – WVrock 2014-12-06 20:16:51

24

覆盖windowClosing方法。

public void windowClosing(WindowEvent e) 

当窗口处于被关闭的过程中它被调用。关闭操作可以在此时被覆盖。

+3

请问如果用户关闭应用程序(例如,通过点击Cmd的+ Q在Mac上)这项工作?实现此方法的类是否必须为此代码声明“实现WindowListener”?如果是这样的话,那么在答案中加入它可能会很好。否则这是一个优雅的解决方案。 – brandaemon 2015-11-20 21:42:09

5
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

也有效。首先创建一个名为frame的JFrame,然后在下面添加此代码。

+7

但是这样不会执行'confirmExit()'方法,因为OP会喜欢它 – hage 2012-02-01 09:34:09

+0

虽然 – Russell 2012-02-01 09:40:55

+10

做了同样的事情不,我不想简单地关闭程序。我想在事情发生之前做点事情。 – alxcyl 2012-02-01 09:55:10

0

试试这个:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 

它将工作。

0

这可能工作:

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

1

这就是我把,那是我在做一个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); 
     } 
    }); 
}); 
相关问题