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