這個 gui3.java 是照我之前要大家測試的方法修改 gui.java, 當然改了檔案名稱以及 class, constructor, 並加上註解 ! 還有, 為了方便加上註解, 我把許多 lines 拆開儘可能一列只寫一 statement :-) D:\jtest> path "c:\Program Files\Java\jdk1.6.0_24\bin";%path% D:\jtest> javac gui3.java D:\jtest> java gui3 D:\jtest> linenum < gui3.java 01 //gui3.java -- gui3 sample, @CopyLeft by tsaiwn@cs.nctu.edu.tw 02 //加上一些註解 03 //package ...; // 指定我這 class 的命名空間 namespace, 阿就是要放哪個目錄啦 04 import java.applet.*; 05 import java.awt.*; 06 import java.awt.event.*; 07 // 注意要寫 public class 不然 Applet 有問題 08 public class gui3 extends Applet implements ActionListener { // 我就是 Applet 09 Panel ppp; // 木板 (面板) 10 Button bbb; // 按鈕 11 TextArea tt; // 文字區 12 TextField tx; // 文字一列的欄 13 14 public static void main(String gg[ ]) { // Java 的主程式都這樣寫 15 Frame f = new Frame("Windows 2011"); // 開個窗 f 16 gui3 me = new gui3( ); // 模仿 Applet .. // 生出自己 (class gui3 ) 17 me.init( ); // 因為 Applet 被生出後先做 init( ); 18 me.start( ); // .. 再做 start( ) 19 f.add(me, "Center"); // 把 Applet (me) 放入窗 f 內 20 f.setSize(580, 520); // Frame 是 Window, 用 BorderLayout 21 f.setVisible(true); // f.show( ); 22 Bird ggyy = new Bird(f); // 把 f 傳過去給 Bird 的 constructor記住! 23 f.addWindowListener( ggyy ); // 注意不是寫 this 了喔! 24 // 這個要求監聽的句子可以寫在 f 被 new 出來之後的任何地方! 25 } // main( 26 27 void println(String fmt, Object... oo) { print(fmt+"\n", oo); } 28 void print(String fmt, Object... oo){System.out.printf(fmt, oo); } 29 void prinf(String fmt, Object... oo){System.out.printf(fmt, oo); } 30 31 public gui3( ) { 32 super( ); // 可以不寫 33 println(" Now doing ... gui3 constructor !"); 34 } // Constructor; 注意要寫 public 不然 Applet 有問題 35 public void start( ) { 36 super.start( ); 37 println(" Now in start( ) ... "); 38 }// start( 39 ///////////////////////////// 40 public void init( ) { 41 ppp = new Panel( ); tx=new TextField("你可以在這打字", 38); 42 bbb = new Button(" empty 按這裡看看 "); 43 ppp.add(bbb); // 把 bbb 按鈕塞入 ppp 木板 44 ppp.setSize(280, 120); // 好像沒有用ㄟ ? 45 bbb.setFont(new Font("標楷體",1,36)); 46 47 bbb.addActionListener(this); // 要求監聽這個按鈕 (看板) 48 49 setLayout(new BorderLayout( ) ); // change Layout Manager 擺設經理 50 // 因為 Applet 是 Panel, 其 default Layout Manager 是 FlowLayout 51 // 設為 BorderLayout 後就可以指定 東西南北中 五個方位 放入元件 52 ppp.setBackground(Color.pink); // 背景色 粉紅 53 tt = new TextArea("Hahaha\n", 5,20,TextArea.SCROLLBARS_BOTH); 54 add(ppp, "North"); /// ppp 放 我 (gui3, 是Applet)的 北邊 55 add(tt, "Center"); /// tt 文字區塊 放 我 (gui3, 是Applet)的 正中間 56 tt.setFont(new Font("Ariel",3,32)); // 字體大一些 57 Panel pn = new Panel( ); 58 Panel ptt=new Panel( ); 59 Panel pOut = new Panel( ); 60 pOut.setLayout(new BorderLayout( )); // 外匡面版用 BorderLayout 61 pOut.add(pn, "South"); // pn 塞在 pOut 這 Panel 內 :-) 木板上再放木板! 62 pOut.add(ptt,"North"); // pOut 內塞兩個 Panel : pn, ptt 63 // 現在 pOut 木板上有兩塊木板: ptt 上, 下是 pn (南) 64 ptt.add(new Button("請在右邊打字: ")); // 放入 ptt 65 ptt.add(tx); // 依序 放入 ptt 66 /// 再來, pn 這木板上 放入很多按鈕 ! 所以用 array 陣列 比較方便 ! 67 pn.setBackground(Color.yellow); 68 tx.setFont(new Font("標楷體",1,16)); 69 bt = new Button[98]; // 只會生出 98 個參考 (阿其實就是 C++ 的指標啦) 70 // 上列生出 98 個 參考(Reference) 不會用很多記憶體 :-) 71 // 實際上會生出幾個按鈕是由 bMsg.length 決定 (看下列) 72 for(int i=1; i< bMsg.length; ++i) { // 這樣寫是個好習慣! 73 // 因為你去改 bMsg 陣列增加元素也不用來改這裡 :-) 74 bt[i] = new Button(bMsg[i]); // 真正生出六個 Button (注意 0 故意不用) 75 pn.add(bt[i]); bt[i].setFont(new Font("細明體",0 ,16)); 76 // 注意上列是在做勞作 :-) 把按鈕加入 pn 木板 ! 77 bt[i].addActionListener(this); // 請求監聽 "動作事件"(ActionEvent) 78 // 注意上列是要求監聽 bb[i] 喔 ! 79 } // for int i 80 add(pOut, "South"); // 把 pOut 塞入我(gui3)這個 Applet 南邊 81 bt[3].setForeground(Color.red); 82 validate( ); // 做了一些對圖形元件 的動作記得要做這 validate( ); 83 } // init( 84 85 Button bt[ ]; // 宣告說 bt[ ] 是 Button 陣列 (array) 86 String bMsg[ ] = {"000", "Bt001", "btBBB", 87 "哈哈哈會讀輸入", "bt西西", "BT五", "六 六 大順 囉", "Bye" 88 ,"八仙過海囉", "More Button" 89 }; // 結束要有分號 ! 因大括號內是 Data ! 90 91 public void paint(Graphics g) { 92 System.out.println(" Paint kk = " + kk++); 93 // do drawing something ... 94 validate( ); // 95 } // paint( 96 97 public void actionPerformed(ActionEvent e) { 98 Object what = e.getSource( ); // 誰被按了一下 ? 99 String gg = "You press " + e.getActionCommand( ); 100 101 if(what == bbb) { 102 cid = (cid+1) % yyc.length; 103 bbb.setForeground( yyc[cid] ); return;} // 做完就 return 104 105 if(what == bt[7]) System.exit(0); // myFrame.dispose( ); 106 if(what == bt[1]) ppp.setBackground(Color.red); 107 if(what == bt[6]) { ppp.setBackground(Color.green); 108 tt.append("如果 林志玲 來演講, 你會去聽嗎? "); } // if 109 bbb.setLabel(gg); tt.append(gg+"\n"); 110 if(what == bt[3]) { tt.append("讀到 " + tx.getText( ) + "\n"); 111 ppp.setBackground(Color.gray); } 112 repaint( ); // 會偷叫 update(Graphics); 113 } // actionPerformed( 114 115 public void update(Graphics g) { // 只是看看何時會跑過來這 116 System.out.println(" update ==> kk = " + kk++); 117 super.update(g); // 叫用上層(super class)的 update( ) 118 } // update( will called by repaint( ) 119 120 public void stop( ) { //跑去別的網頁會到這 121 super.stop( ); 122 println(" STOP ..now in stop( ) ... "); // 只是看看何時會跑過來這 123 }// stop( 124 125 public void destroy( ) { // 當 Browser 被關閉會到這 126 println(" ! now in destroy( ) ... "); // 只是看看何時會跑過來這 127 super.destroy( ); 128 }// destroy( 129 //////// ============================================== /////////////// 130 131 int rand( ) { return (int) (32768* Math.random( ) ); } //模仿 C 132 133 ///gui2.java 134 Color yyc[ ] = { Color.red, Color.green, Color.blue 135 , Color.PINK, new Color(198,222,66), new Color(198,8,198) 136 }; // 注意這array yyc[ ]結束也要有分號; 因為大括號內是 Data ! 137 int cid = -1; 138 int kk = 0; // Global variable to this class 139 } // class 140 /// 141 //Bird.java /// NEW in gui3.java 142 //以下可以放另一個檔案, 也可跟別的 class 放在同一個檔案 <font color=Red> 143 //請注意因寫在同一個檔案故不可再寫 public class; 一檔案最多一個 public class 144 class Bird implements java.awt.event.WindowListener { 145 Frame myFrame = null; 146 Bird(Frame fff) { myFrame = fff; } // 記住以便日後各函數用到 147 public void windowOpened(java.awt.event.WindowEvent e) {;} 148 public void windowClosed(java.awt.event.WindowEvent e) {;} 149 public void windowIconified(java.awt.event.WindowEvent e) {;} 150 public void windowDeiconified(java.awt.event.WindowEvent e) {;} 151 public void windowActivated(java.awt.event.WindowEvent e) {;} 152 public void windowDeactivated(java.awt.event.WindowEvent e) {;} 153 ///以上不寫內容還是要留著喔! 154 /// 點按窗右上角的 X 會執行以下 windowClosing( ) 155 public void windowClosing(java.awt.event.WindowEvent e) { 156 System.out.println("Bye bye 再見..再見.."); 157 if(myFrame != null) myFrame.dispose( ); //System.exit(0); 158 // 注意我故意用跟前面說明不太一樣的做法 ! 159 } // windowClosing( 160 }// class Bird D:\jtest>
你可以把 Bird 這 class 切出來另存在 Bird.java 檔案內, 然後再測試看看, 阿當然結果是一樣的啦! 你也可以建立一個簡單文字檔 y33.htm 含以下句子: <applet code=gui3 width=688 height=500> </applet> 然後再把該 y33.htm 網頁開啟來看看 ! 調整窗的大小看看 ! 再建立一個 y38.htm 含以下句子(Applet 大小會隨窗大小改變!): <applet code=gui3 width=88% height=66%> </applet> 然後再把該 y38.htm 網頁開啟來看看 ! 調整窗的大小看看 !