JFrame,JDialog,JInternalFrame关闭的拦截

JFrame,JDialog,JInternalFrame关闭的拦截
        有很多刚开始学Swing的人经常问JFrame关闭的时候先询问下是否关闭,即弹出一个对话框让用户点击选择YES或NO,其实稍微进去查看源代码就能找到答案。我们找到那里是发出关闭事件的地方,我们在那个地方进行拦截就可以了,查看源代码可以知道在JFrame中有这么一个方法:
protected   void  processWindowEvent(WindowEvent e)  {
   
//do Samething。。。。。。。。。。。。。
}

       这个方法一直追上去可以发现它是由Window类中派生出来的,我们先看一张图:

      从图上看以看出我们常用的JFrame和JDialog都上由Window派生出来的,那么所有基于Window下的窗口点击关闭按钮都是在上述的那个方法中进行判断,那么我们重写那个方法,在里面进行拦截如:
/** */ /***
     * 重写此方法让用户确认是否需要关闭
     * 
*/

    @Override
    
protected   void  processWindowEvent(WindowEvent e)  {
        
boolean flag = false;
        
        
if (e.getID() == WindowEvent.WINDOW_CLOSING) 
          
//关闭的提示选择
          int result= JOptionPane.showConfirmDialog(
                              
this,
                              (
"确认要关闭吗?"),
                              (
"关闭"),
                              JOptionPane.YES_NO_OPTION);

              
if(result == JOptionPane.NO_OPTION){
                  
//不关闭,系统托盘????
                  flag = true;
              }
else{
                  
//关闭的处理
              }

        }

         
if(!flag){
           
//点击的了YES,那么交给上面去处理关闭的处理
            super.processWindowEvent(e);
          }

     }
   
      对于JInternalFrame,它是一个轻量级组件,所以它的确认关闭需要做其他处理,查找API就会很发现有这么个方法:doDefaultCloseAction
是处理关闭事件的处理,如果您不放心确实是这个方法,那么你就去找那个关闭按钮发事件的地方才放心的话,那么我们也很容易找到在
JInternalFrame的Title是由BasicInternalFrameTitlePane这个类中负责绘制的,这里就有点击关闭调用doDefaultCloseAction方法的,既然如此那么重写这方法就OK了,代码如下:
/** */ /***
             * 重写此方法让用户确认是否需要关闭
             * 
*/

            @Override
            
public   void  doDefaultCloseAction() {
                
//关闭的提示选择
                int result= JOptionPane.showConfirmDialog(
                          
this,
                          (
"确认要关闭JInternalFrame吗?"),
                          (
"关闭"),
                          JOptionPane.YES_NO_OPTION);

                  
if(result == JOptionPane.YES_OPTION){
                      
//如果选择YES,交由上层设置的关闭处理
                      super.doDefaultCloseAction();
                  }

            }

总的测试代码如下:
import  java.awt.event.WindowEvent;
import  javax.swing.JButton;
import  javax.swing.JDesktopPane;
import  javax.swing.JFrame;
import  javax.swing.JInternalFrame;
import  javax.swing.JOptionPane;
import  javax.swing.SwingUtilities;

/** */ /***
 * JFrame和JInternalFrame关闭前先确认是否关闭
 * 
@author kissjava
 * www.blogjava.net/kissjava
 * *
*/

public   class  CloseFrameDemo  extends  JFrame {

    
public CloseFrameDemo(){
        
this.setTitle("CloseFrameDemo");
        jbInit();
        
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
this.setSize(800800);
        
this.setVisible(true);
    }

    
    
private void jbInit(){
        JDesktopPane desktop 
= new JDesktopPane();
        JInternalFrame internalFrame 
= this.createJInternalFrame();
        JButton btn 
= new JButton("DEMO");
        internalFrame.add(btn, 
"Center");
        desktop.add(internalFrame, JDesktopPane.PALETTE_LAYER);
        internalFrame.setSize(
400,400);
        internalFrame.setVisible(
true);
        
this.add(desktop, "Center");
    }

    
    
private JInternalFrame createJInternalFrame(){
        JInternalFrame internalFrame 
= new JInternalFrame("JInternalFrame Close Demo"truetruetruetrue){
            
/** *//***
             * 重写此方法让用户确认是否需要关闭
             * 
*/

            @Override
            
public void doDefaultCloseAction(){
                
//关闭的提示选择
                int result= JOptionPane.showConfirmDialog(
                          
this,
                          (
"确认要关闭JInternalFrame吗?"),
                          (
"关闭"),
                          JOptionPane.YES_NO_OPTION);

                  
if(result == JOptionPane.YES_OPTION){
                      
//如果选择YES,交由上层设置的关闭处理
                      super.doDefaultCloseAction();
                  }

            }

        }
;
        
return internalFrame;
    }


    
/** *//***
     * 重写此方法让用户确认是否需要关闭
     * 
*/

    @Override
    
protected void processWindowEvent(WindowEvent e) {
        
boolean flag = false;
        
        
if (e.getID() == WindowEvent.WINDOW_CLOSING) 
          
//关闭的提示选择
          int result= JOptionPane.showConfirmDialog(
                              
this,
                              (
"确认要关闭吗?"),
                              (
"关闭"),
                              JOptionPane.YES_NO_OPTION);

              
if(result == JOptionPane.NO_OPTION){
                  
//不关闭,系统托盘????
                  flag = true;
              }
else{
                  
//关闭的处理
              }

        }

         
if(!flag){
           
//点击的了YES,那么交给上面去处理关闭的处理
            super.processWindowEvent(e);
          }

     }


    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable(){
            
public void run(){
                
new CloseFrameDemo();
            }

        }
) ;
    }

}

你可能感兴趣的:(JFrame,JDialog,JInternalFrame关闭的拦截)