有才華的人,別忘記給滋潤你的那塊土壤施肥

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks
                  有很多剛開始學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.aygfsteel.com/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();
                      }

                  }
          ) ;
              }

          }

          posted on 2009-08-14 22:58 kissjava 閱讀(2625) 評論(0)  編輯  收藏 所屬分類: swing
          主站蜘蛛池模板: 五指山市| 明溪县| 安宁市| 江川县| 易门县| 家居| 普兰店市| 屏边| 兴国县| 交口县| 阳东县| 泽州县| 明溪县| 德州市| 巴林左旗| 奉化市| 咸丰县| 盈江县| 桦甸市| 绵竹市| 巴青县| 黄石市| 扎赉特旗| 凤翔县| 华池县| 改则县| 平舆县| 蓝山县| 宣恩县| 北辰区| 鹰潭市| 长丰县| 三江| 内江市| 湘西| 鸡东县| 海晏县| 昌邑市| 石泉县| 昌江| 盐山县|