程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JFrame,JDialog,JInternalFrame關閉的攔截

JFrame,JDialog,JInternalFrame關閉的攔截

編輯:關於JAVA

有很多剛開始學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();
             }
         }) ;
     }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved