2012-11-07 49 views
6

我有一個問題,爲什麼「的windowClosed」法不被在我的測試代碼如下調用,爲什麼windowClosed沒有被調用,有人可以告訴我更多關於這個嗎?

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 

public class Tmp { 

    class TFrame extends JFrame{ 
     private static final long serialVersionUID = -5729542298504858399L; 

     public TFrame() { 
      setTitle("title"); 
      setSize(300, 300); 
     } 
    } 


    public static void main(String[] args) { 
     final TFrame t = new Tmp().new TFrame(); 
     t.addWindowStateListener(new WindowAdapter() { 
      @Override 
      public void windowStateChanged(WindowEvent e) { 
       super.windowStateChanged(e); 
       System.out.println(e.getOldState() + "<-old new->" + e.getNewState()); 
      } 
     }); 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
      } 
     }); 
     t.setVisible(true); 
    } 
} 

如果我寫的聲明setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)或顯式調用Dispose()來TFRAME, windowClosed()將被調用。

有沒有人可以更詳細地解釋它,我很困惑爲windowClosed()編寫監聽器的屬性方式,事先感謝。

//////////////////根據從丹//////////////

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 

public class Tmp { 

    class TFrame extends JFrame { 
     // ignored ..... 
     t.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosed(WindowEvent e) { 
       super.windowClosed(e); 
       System.out.println(e.getID() + "closed " + e.getNewState()); 
      } 

      @Override 
      public void windowClosing(WindowEvent e) { 
       super.windowClosing(e); 
       System.out.println(e.getID() + "closing" + e.getNewState()); 
       int quit = JOptionPane.showConfirmDialog(t, "Are you sure to quit?"); 
       if(quit == JOptionPane.YES_OPTION){ 
        t.dispose(); 
       } 
       else if (quit == JOptionPane.NO_OPTION){ 
        t.setVisible(false); 
       } 
      } 
     }); 
     t.setVisible(true); 
     t.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    } 
} 

回答

7

一些導遊更新setDefaultCloseOperation的默認值是HIDE_ON_CLOSE。有了這個,窗戶並未關閉,只是隱藏起來。

將值更改爲其他值時,您將它實際關閉而不是隱藏它,以便觸發事件。

+1

感謝您的回答,我檢查了JFrame.java中的setDefaultCloseOperation(..),它告訴您發佈的內容:-)。還有一件事我想提出的是,如果我想調用windowClosed(),應該總是使用「DISPOSE_ON_CLOSE」作爲參數?如果給出一些不錯的和財產指南/代碼片段,那將是非常好的。 – vicd

+0

這取決於上下文。例如,如果您想要在關閉之前向用戶提問,則必須將其設置爲DO_NOTHING_ON_CLOSE,並在windowClosing上顯示用戶的問題,然後處理()窗口。 –

+0

我明白了,我根據你的建議寫了一個快速演示,是否正確的實現方式?請參閱更新的帖子:-) – vicd

相關問題