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