JFrame关闭按钮的弹出窗口

4

我正在做一些基础的Java Swing应用程序(初学者级别)。我的任务是:当我按下JFrame上的关闭按钮时,我想要一个JOptionPane确认对话框,而不是直接关闭窗口。

下面是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
请看这里 - MadProgrammer
2个回答

6

Yes you can do this by using a 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);

请参阅此教程以获取更多详细信息。但是对于您的情况,我建议您使用适配器类(因为您只需要一个事件,所以不需要累死自己并实现所有方法),以下是根据您的要求的示例。
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 );  
            }  
        }  
    }  
}  

欢迎。我还建议您查看这个链接 http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29 以及它的方法 addShutdownHook - Freak

3
您可以按照以下步骤完成:

  1. Replace the line frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); with frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

  2. Implement WindowListener and override its all abstract methods. You can find it here.

  3. Override the public void windowClosing(WindowEvent e) method some this way:

     @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
           }
     }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接