JFrame,JDialog,JInternalFrame关闭的拦截

转载于:http://www.bianceng.cn/Programming/Java/201101/23095.htm

 

有很多刚开始学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(800, 800);
         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", true, true, true, true){
             /** *//***
              * 重写此方法让用户确认是否需要关闭
              * */
             @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();
             }
         }) ;
     }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值