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

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks
                  有很多剛開始學Swing的人經(jīng)常問JFrame關閉的時候先詢問下是否關閉,即彈出一個對話框讓用戶點擊選擇YES或NO,其實稍微進去查看源代碼就能找到答案。我們找到那里是發(fā)出關閉事件的地方,我們在那個地方進行攔截就可以了,查看源代碼可以知道在JFrame中有這么一個方法:
          protected void processWindowEvent(WindowEvent e) {
             
          //do Samething。。。。。。。。。。。。。
          }

                 這個方法一直追上去可以發(fā)現(xiàn)它是由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){
                            
          //不關閉,系統(tǒng)托盤????
                            flag = true;
                        }
          else{
                            
          //關閉的處理
                        }

                  }

                   
          if(!flag){
                     
          //點擊的了YES,那么交給上面去處理關閉的處理
                      super.processWindowEvent(e);
                    }

               }
             
                對于JInternalFrame,它是一個輕量級組件,所以它的確認關閉需要做其他處理,查找API就會很發(fā)現(xiàn)有這么個方法:doDefaultCloseAction
          是處理關閉事件的處理,如果您不放心確實是這個方法,那么你就去找那個關閉按鈕發(fā)事件的地方才放心的話,那么我們也很容易找到在
          JInternalFrame的Title是由BasicInternalFrameTitlePane這個類中負責繪制的,這里就有點擊關閉調(diào)用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){
                            
          //不關閉,系統(tǒng)托盤????
                            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 閱讀(2619) 評論(0)  編輯  收藏 所屬分類: swing
          主站蜘蛛池模板: 高邑县| 东海县| 邓州市| 临夏市| 龙胜| 乐昌市| 古田县| 丹寨县| 鸡东县| 广宁县| 河池市| 揭东县| 元谋县| 达拉特旗| 武宁县| 始兴县| 平果县| 上林县| 东兴市| 惠州市| 南阳市| 桂林市| 凤台县| 阳原县| 安庆市| 台中县| 融水| 张家界市| 台东市| 襄樊市| 巴彦淖尔市| 平远县| 方正县| 平昌县| 滦平县| 陆河县| 深水埗区| 汪清县| 栖霞市| 筠连县| 红桥区|