More Hint to test gui.java 了解更多關於 "事件驅動" 的概念 

   測試過 gui.java 後, 應該發現 java gui 後, 
生出的窗無法用右上角的 X 關掉!
那要如何改才可以點按窗右上角的 X 關掉呢?
如果之前的 Gigi*.java 那幾個範例你有仔細看過, 
應該已經會修改! 不然就仔細看囉 :
(可以用 gui2.java 去改)

1) 這次我們把處理"關窗"動作的相關函數寫在另外一個 class Bird
   可以與 class gui 放同一個檔案, 也可獨立放!
   就決定獨立放 Bird.java 好了, 請把以下程式碼存到  Bird.java 
     //Bird.java
     //以下可以放另一個檔案, 也可跟別的 class 放在同一個檔案   
     class Bird  implements  java.awt.event.WindowListener  {
         public void windowOpened(java.awt.event.WindowEvent e) {;}
         public void windowClosed(java.awt.event.WindowEvent e) {;}
         public void windowIconified(java.awt.event.WindowEvent e) {;}
         public void windowDeiconified(java.awt.event.WindowEvent e) {;}
         public void windowActivated(java.awt.event.WindowEvent e) {;}
         public void windowDeactivated(java.awt.event.WindowEvent e) {;}
       ///以上不寫內容還是要留著喔!
        /// 點按窗右上角的 X 會執行以下 windowClosing( )
         public void windowClosing(java.awt.event.WindowEvent e) { 
             System.out.println("Bye bye 再見..再見..");
             System.exit(0);
         }
     }// class Bird


2) 再來要跟"監聽經理(Listener)"要求監看"視窗事件"(WindowEvent)
   請在主程式 main(String[ ]) 的最後加入以下兩句:  
       Bird ggyy = new Bird( );
       f.addWindowListener( ggyy );   // 注意不是寫 this 了喔!
       // 這個要求監聽的句子可以寫在 f 被 new 出來之後的任何地方!

   以上這兩句意思是說:
       先 new (生出) 一個 Bird 物件 ggyy,
       然後告訴窗 f 說萬一有做任何與 WindowEvent 有關的事件,
       就把該 視窗事件(WindowEvent) 傳給 ggyy 這物件讓他執行對應的程式!
         例如若用滑鼠左鍵點按窗  f 的右上角的 X,
      則呼叫 ggyy 所屬 class 的 void windowClosing( ) 

   好了, 你可以存檔後重新編譯並執行了 ! 點窗右上角的 X 看看會怎樣 ! 

注意 所有處理 視窗事件的函數必須照 WindowListener 這 Interface (介面)
   裡面函數的雛型 (prototype of functions)寫! 共有七隻函數!
   因為  class Bird 有 implements WindowListener   
   所以在 WindowListener 內的七隻函數都要寫!
 (少寫一隻翻譯就不會過 !)
   即使不想做事也要寫個空的函數!
   因為這次我們只要處理 "關窗" 的動作, 阿就是  windowClosing
   所以只要把 void windowClosing(WindowEvent e) 這函數寫好就可!
   裡面則只要 System.exit(0); 就會結束程式, 這樣窗自然就關掉囉! 
     如果這時可看見該窗的"參考(reference)", 例如 f,
   則可以做 f.dispose( ); 把該窗關掉,
   這通常用在要關窗, 但主程式還不要結束的時機使用! 

     還有還有,  該七支 處理視窗事件的函數當然都是接受一個 WindowEvent 的參數!
 你可以使用 WindowEvent 這 class 的各個函數,
 但是這次只是要"關窗", 所以傳入的 WindowEvent 物件根本用不到!  


  ?? ==> 那該些 "空的處理函數" 可不可以不要寫?
可以! 
   那就不要 implements WindowListener, 
改用  extends java.awt.event.WindowAdapter  
這樣, 可以只寫你要的處理函數!  
 不過也有缺點, 就是 ..
萬一你寫錯了函數名稱則編譯器也看不出! (廢話!)
而且若你的 class 已經有 extends 別的 class, 
則不能再 extends WindowAdapter,
一定要 implements WindowListener,
這是因為 Java   不支持  Multiple Inheritance (多重繼承)!
 (C++ 則可以多重繼承, 但通常繼承時要加 "virtual" 這字!)

 ********
    其實, 若只是要讓 Window右上角的 X 按一下會關窗,
則可以改用 Swing Libaray 的 JFrame, 然後對該 JFrame 
做 .setDefaultCloseOperation( 1 );  //JFrame.EXIT_ON_CLOSE
這樣就不必自己處理 WindowEvent 視窗事件了 :-)