<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    有才華的人,別忘記給滋潤(rùn)你的那塊土壤施肥

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

           這個(gè)方法一直追上去可以發(fā)現(xiàn)它是由Window類中派生出來(lái)的,我們先看一張圖:

          從圖上看以看出我們常用的JFrame和JDialog都上由Window派生出來(lái)的,那么所有基于Window下的窗口點(diǎn)擊關(guān)閉按鈕都是在上述的那個(gè)方法中進(jìn)行判斷,那么我們重寫(xiě)那個(gè)方法,在里面進(jìn)行攔截如:
    /***
         * 重寫(xiě)此方法讓用戶確認(rèn)是否需要關(guān)閉
         * 
    */

        @Override
        
    protected void processWindowEvent(WindowEvent e) {
            
    boolean flag = false;
            
            
    if (e.getID() == WindowEvent.WINDOW_CLOSING) 
              
    //關(guān)閉的提示選擇
              int result= JOptionPane.showConfirmDialog(
                                  
    this,
                                  (
    "確認(rèn)要關(guān)閉嗎?"),
                                  (
    "關(guān)閉"),
                                  JOptionPane.YES_NO_OPTION);

                  
    if(result == JOptionPane.NO_OPTION){
                      
    //不關(guān)閉,系統(tǒng)托盤(pán)????
                      flag = true;
                  }
    else{
                      
    //關(guān)閉的處理
                  }

            }

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

         }
       
          對(duì)于JInternalFrame,它是一個(gè)輕量級(jí)組件,所以它的確認(rèn)關(guān)閉需要做其他處理,查找API就會(huì)很發(fā)現(xiàn)有這么個(gè)方法:doDefaultCloseAction
    是處理關(guān)閉事件的處理,如果您不放心確實(shí)是這個(gè)方法,那么你就去找那個(gè)關(guān)閉按鈕發(fā)事件的地方才放心的話,那么我們也很容易找到在
    JInternalFrame的Title是由BasicInternalFrameTitlePane這個(gè)類中負(fù)責(zé)繪制的,這里就有點(diǎn)擊關(guān)閉調(diào)用doDefaultCloseAction方法的,既然如此那么重寫(xiě)這方法就OK了,代碼如下:
    /***
                 * 重寫(xiě)此方法讓用戶確認(rèn)是否需要關(guān)閉
                 * 
    */

                @Override
                
    public void doDefaultCloseAction(){
                    
    //關(guān)閉的提示選擇
                    int result= JOptionPane.showConfirmDialog(
                              
    this,
                              (
    "確認(rèn)要關(guān)閉JInternalFrame嗎?"),
                              (
    "關(guān)閉"),
                              JOptionPane.YES_NO_OPTION);

                      
    if(result == JOptionPane.YES_OPTION){
                          
    //如果選擇YES,交由上層設(shè)置的關(guān)閉處理
                          super.doDefaultCloseAction();
                      }

                }

    總的測(cè)試代碼如下:
    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關(guān)閉前先確認(rèn)是否關(guān)閉
     * 
    @author kissjava
     * m.tkk7.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){
                
    /***
                 * 重寫(xiě)此方法讓用戶確認(rèn)是否需要關(guān)閉
                 * 
    */

                @Override
                
    public void doDefaultCloseAction(){
                    
    //關(guān)閉的提示選擇
                    int result= JOptionPane.showConfirmDialog(
                              
    this,
                              (
    "確認(rèn)要關(guān)閉JInternalFrame嗎?"),
                              (
    "關(guān)閉"),
                              JOptionPane.YES_NO_OPTION);

                      
    if(result == JOptionPane.YES_OPTION){
                          
    //如果選擇YES,交由上層設(shè)置的關(guān)閉處理
                          super.doDefaultCloseAction();
                      }

                }

            }
    ;
            
    return internalFrame;
        }


        
    /***
         * 重寫(xiě)此方法讓用戶確認(rèn)是否需要關(guān)閉
         * 
    */

        @Override
        
    protected void processWindowEvent(WindowEvent e) {
            
    boolean flag = false;
            
            
    if (e.getID() == WindowEvent.WINDOW_CLOSING) 
              
    //關(guān)閉的提示選擇
              int result= JOptionPane.showConfirmDialog(
                                  
    this,
                                  (
    "確認(rèn)要關(guān)閉嗎?"),
                                  (
    "關(guān)閉"),
                                  JOptionPane.YES_NO_OPTION);

                  
    if(result == JOptionPane.NO_OPTION){
                      
    //不關(guān)閉,系統(tǒng)托盤(pán)????
                      flag = true;
                  }
    else{
                      
    //關(guān)閉的處理
                  }

            }

             
    if(!flag){
               
    //點(diǎn)擊的了YES,那么交給上面去處理關(guān)閉的處理
                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 閱讀(2616) 評(píng)論(0)  編輯  收藏 所屬分類: swing
    主站蜘蛛池模板: 亚洲美女免费视频| 精品97国产免费人成视频| 亚洲精品伊人久久久久| 亚洲性猛交xx乱| 亚洲视频在线免费播放| 亚洲AV无码不卡在线播放| 久久精品国产亚洲AV麻豆王友容| 亚洲熟妇无码另类久久久| 亚洲中文字幕无码一区| 亚洲无线观看国产精品| 久久精品国产亚洲av麻豆| 亚洲网址在线观看你懂的| 亚洲另类小说图片| 亚洲综合精品成人| 精品国产_亚洲人成在线| 立即播放免费毛片一级| 九九久久精品国产免费看小说| 中文字幕免费视频精品一| 久久免费精彩视频| 久草视频在线免费| 色www永久免费视频| 日韩亚洲国产综合久久久| 国产亚洲精品资源在线26u| 亚洲四虎永久在线播放| 2020国产精品亚洲综合网| 国产产在线精品亚洲AAVV| 在线观看免费黄网站| 亚洲成人免费电影| 在线免费观看中文字幕| 久久影视国产亚洲| 久久亚洲日韩精品一区二区三区| 亚洲资源最新版在线观看| 日韩少妇内射免费播放| 久久免费线看线看| 久久经典免费视频| 亚洲Av无码乱码在线播放| 亚洲精品成人av在线| 亚洲AV色欲色欲WWW| 一个人免费视频在线观看www| 永久在线免费观看| 四虎影视永久免费观看网址|