有很多剛開始學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(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){
//不關閉,系統(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();
}
}) ;
}
}



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




























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

















總的測試代碼如下:






























































































