2012-02-01 140 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); 
     } 
    }); 
}); 
相關問題