2013-03-04 138 views
4

我正在做一些基本的Java Swing application(初學者級別)。 什麼,我要做的就是當我按下close button on JFrame到colse的窗口,我想一個JOptionPane Confirm Dialog,而不是直接的密切JFrame的彈出式關閉按鈕

這裏是代碼的JFrame

JFrame frame= new JFrame("frame"); 
    frame.setSize(300,300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.pack(); 

和JOptionPane的代碼是這樣

final JOptionPane optionPane = new JOptionPane("Are You sure?",JOptionPane.QUESTION_MESSAGE, 
JOptionPane.YES_NO_OPTION); 

所以當關閉按鈕上JFrame按下這個彈出應該出來而不是直接關閉
請指導我如何做到這一點..謝謝提前

+2

看看[這裏](http://stackoverflow.com/questions/3777146/how-can-a-swing- windowlistener-veto-jframe-closing) – MadProgrammer 2013-03-04 09:47:31

回答

3

您可以通過以下步驟來做到:

  1. 替換行frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

  2. 實施WindowListener並覆蓋其所有AB stract方法。你可以find it here

  3. 覆蓋的public void windowClosing(WindowEvent e)一些方法是這樣的:

    @Override 
    public void windowClosing(WindowEvent e){ 
         int result = JOptionPane.showConfirmDialog(null, "Are you sure,"Confirm",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); 
    
         if(result == JOptionPane.YES_OPTION){ 
           System.exit(0); 
         }else{ 
           //Do nothing 
         } 
    } 
    
+0

謝謝你,先生有幫助+1爲您的指導。 – Sikander 2013-03-04 10:14:25

+0

@Sikander歡迎您 – gprathour 2013-03-04 10:15:00

+0

更好地解釋瞭如此改爲接受的答案 – Sikander 2013-03-09 19:43:02

6

是的,你可以通過使用WindowListener來做到這一點。

public void windowClosed(WindowEvent e) { 
     //This will only be seen on standard output. 
     displayMessage("WindowListener method called: windowClosed."); 
    } 

    public void windowOpened(WindowEvent e) { 
     displayMessage("WindowListener method called: windowOpened."); 
    } 

    public void windowIconified(WindowEvent e) { 
     displayMessage("WindowListener method called: windowIconified."); 
    } 

    public void windowDeiconified(WindowEvent e) { 
     displayMessage("WindowListener method called: windowDeiconified."); 
    } 

    public void windowActivated(WindowEvent e) { 
     displayMessage("WindowListener method called: windowActivated."); 
    } 

    public void windowDeactivated(WindowEvent e) { 
     displayMessage("WindowListener method called: windowDeactivated."); 
    } 

    public void windowGainedFocus(WindowEvent e) { 
     displayMessage("WindowFocusListener method called: windowGainedFocus."); 
    } 

    public void windowLostFocus(WindowEvent e) { 
     displayMessage("WindowFocusListener method called: windowLostFocus."); 
    } 

    public void windowStateChanged(WindowEvent e) { 
     displayStateMessage(
      "WindowStateListener method called: windowStateChanged.", e); 



請參閱this tutorial進一步的細節。
但對於你的情況,我建議你使用適配器類工作(因爲你只需要一個事件,因此不需要厭倦,並實現所有方法),所以這裏是根據您的需求量的一個例子

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class NoCloseFrame extends JFrame { 
    public static void main(String[] arg) { 
     new NoCloseFrame(); 
    } 

    public NoCloseFrame() { 
     super("No Close Frame!"); 
     setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
     setSize(300, 300); 
     setVisible(true); 
     addWindowListener(new AreYouSure()); 
    } 

    private class AreYouSure extends WindowAdapter { 
     public void windowClosing(WindowEvent e) { 
      int option = JOptionPane.showOptionDialog( 
        NoCloseFrame.this, 
        "Are you sure you want to quit?", 
        "Exit Dialog", JOptionPane.YES_NO_OPTION, 
        JOptionPane.WARNING_MESSAGE, null, null, 
        null); 
      if(option == JOptionPane.YES_OPTION) { 
       System.exit(0); 
      } 
     } 
    } 
} 
+0

非常感謝你的幫助。 – Sikander 2013-03-04 10:09:02

+0

歡迎。我也建議你也看看這個以及http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29及其方法'addShutdownHook' – Freak 2013-03-04 10:10:28

+0

當然,我會...... – Sikander 2013-03-04 10:14:00