有很多剛開(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(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)
{

/** *//***
* 重寫(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();
}
}) ;
}
}
