請注意: 做好習題請到本題討論版依照規定 post,
且注意標題 Subject: LAB10 from 學號姓名 (當然是寫你的學號與姓名啦!)
信件內容包括HTML版的心得, 接著是你的Applet, 最後是帶Line numbers程式碼;
(因為要顯示 Applet, 建議指(link)到你放在大家都可看得到的某網頁空間!)
然後, 你所有的檔案要全部壓縮成一個 .jar 檔案當作夾檔附件
LAB10 寫一個簡單敲鍵盤比賽的Application兼Applet,並寫一個簡單 HTML 與之配合
Due: 2011/05/08 Sunday 23:59
(註: 這題其實很簡單, 觀念懂則一小時內就可做完)
Purpose: 了解如何處理 KeyEvent 與播放 mid 和 wav/au 音效檔
Description:
(1)注意程式必須可當作 Java application, 也可當作Applet;
(2)程式執行至少要類似我提供的 KeyTest.class, 可自行加入你的創意!
(3)開始之前請先把 kt.jar 抓回去你電腦(建議放某子目錄),
然後先做以下測試 :(注意因為你電腦設定不同, 附檔名可能自動變成 .zip )
java -cp kt.jar tw
java -cp kt.jar tm
java -cp kt.jar tw2
java -cp kt.jar tk
java -jar kt.jar
java -cp kt.jar KeyTest (注意大小寫;結果同上!)
(4)測試過後, 請把 kt.jar 解壓縮到你自己新建的一個子目錄,
先很快研究一下 tw.java, tm.java, tm2.java,
該三個檔案是讓你知道如何使用我寫的 WavPlayer.java, MidiPlayer.java,
以及 MidiPlayer2.java; (在不必看這些類別裡面怎麼寫就有辦法使用"物件"!)
(5)接著再研究 tk.java, 然後你可拿 tk.java 去修改為習題!(習題不准叫 tk.java)
不過, tk.java 裡面其實很多這次是用不到的, 可以砍掉!
(6)再次提醒, Panel 系列(包括 Applet)的內定(Default; 預設)
擺設經理(Layout Manager) 是 FlowLayout,
也就是 add 元件進去是用流水式加入方式一直 add 就可,
若要改用其它擺放方式則須執行 setLayout( ),
執行 setLayout( ) 的參數是某種 Layout manager 的物件.
至於窗系列包括對話盒與 Frame (窗框)等之預設 Layout 是
BorderLayout(邊界擺設法), 阿就是 add 的參數一定要指定
東西南北中(East, West, South, North, Center) 五個位置中的一個!
若沒有指定則代表 "Center" 中間!
抓 kt.jar
Extra credit:
左上角放你的照片, 照片右邊放一小段你做這題的主要心得;
其他則至少要像 java -jar kt.jar 的執行結果!
(當然你可以把窗或 Applet 弄大一些例如 800x600 或更大)
(還有, 可以直接使用我之前給大家的 MyApplet.java 或 copy出要用的也可)
以下是與你用 java -jar kt.jar 看到的類似之 Applet:
You are the
-th visitors to this page.
以下是 tk.java (其他請看 kt.jar 解壓縮後各檔案)
01 //tk.java -- test KeyListener, by tsaiwn@cs.nctu.edu.tw
02 //要使用KeyListener很簡單, 阿就該GUI元件 .addKeyListener(gy);
03 //這裡的 gy 是有能力處理 KeyEvent 的物件, 這例子是寫 this,
04 //因為 this class 有 implements KeyListener 也有寫對應的三個函數
05 //請注意, Focus 必須在該被監聽的圖形元件才有用喔
06 import java.applet.*;
07 import java.awt.*;
08 import java.awt.event.*;
09 import javax.swing.*;
10 public class tk extends Applet implements KeyListener {
11 int totalHit = 0;
12 public static final Color aaColor = Color.cyan;
13 static tk me; // 照我這種寫法就可以當作 Applet + Application
14 Button btn; Panel p= new Panel( );
15
16 public static void main(String xx[ ]) {
17 me = new tk( );
18 me.init( ); me.start( );
19 JFrame f = new JFrame( );
20 f.setDefaultCloseOperation(3); // 按右上角 x 會關掉
21 f.add(me, "Center"); f.setSize(500,300);
22 f.setVisible(true);
23 } // main(
24 public void init( ) {
25 btn = new Button(" ");
26 add(p); // Panel
27 add( new Label("按abc123和各種鍵看看") );
28 p.add(btn); p.setPreferredSize( new Dimension(98,38) );
29 p.setBackground( Color.yellow );
30 btn.setBackground( aaColor );
31 btn.setFont( new Font("標楷體", 1, 24) ); // 1 == 粗體
32 btn.addKeyListener(this); // 要求監聽
33 //btn.requestFocus( ); // 使得不必用滑鼠點一下
34 } // init(
35 public void paint(Graphics g) {
36 System.out.println("; Total hit =" + totalHit);
37 btn.requestFocus( ); // 把 focus 拉回來
38 }//paint(
39
40 ////// 以下三個函數是 KeyListener 的 functions (函數; 函式)
41 public void keyPressed(KeyEvent e) { ++totalHit;
42 System.out.println("KeyEvent = " + e);
43 int k = e.getKeyCode( );
44 if(k == KeyEvent.VK_F4) {
45 System.out.println("KeyEvent = " + e);
46 System.exit(0); // F4
47 } // if F4 結束; 不會往下, 所以不必寫 else ...
48 if(k == KeyEvent.VK_A) System.err.println("你按下 A");
49 else if(k == 'B') System.err.println("你按下 B");
50 else if(k >= KeyEvent.VK_F1) System.err.println("\n可能是功能鍵");
51 else if(k>='0' && k<='9') { processOtherKey( ); return; } //數字
52 else if(k < ' ') { processGGYY(k, e); return; } // ' ' is 32 ?
53 System.out.println("KeyEvent = " + e);
54 if(k>=37 && k <=40) System.out.println("\n上下左右鍵(37到40)!");
55 } // keyPressed(
56 public void keyReleased(KeyEvent e) {
57 int k = e.getKeyCode( );
58 System.out.println(" KeyCode=" + k);
59 } // keyReleased
60 public void keyTyped(KeyEvent e) {
61 } // 有意義的字才會到這function
62
63 ////// 做比較多事情就抽出來另外放函數(函式)!
64 public void processGGYY(int k, KeyEvent e) {
65 System.err.println(" in processGGYY( ) ... k = " + k);
66 if(k != 16 && k != 17 && k!=18) return; // Shift, Ctrl, ALT
67 int k2 = e.getKeyLocation( );
68 System.err.println("KeyLocation=" + k);
69 if(k2==2) System.err.print("\n你按了左邊的 ");
70 else System.err.print("\n 是右邊的 ");
71 if(k == 16) System.err.println(" Shift 鍵!");
72 else if(k == 17) System.err.println(" Ctrl 鍵!");
73 else System.err.println(" ALT 鍵!"); // k == 18
74 } ///
75 public void processOtherKey( ) {
76 System.err.println("可能是數字鍵 ...");
77 p.add(ta); // ta 是個 TextArea
78 ta.requestFocus( ); // 搶走 Focus :-) 使得按鍵沒作用
79 //btn.removeKeyListener(this); // 暫時不監聽
80 p.remove(btn); // 暫時弄掉 btn
81 //validate( ); // 哈哈, 不要 validate( ) 剛好看不見 TextArea
82 try{ Thread.sleep(2568); }catch(Exception e){;}
83 p.remove(ta); p.add(btn);
84 validate( ); btn.requestFocus( ); // 重要 !
85 //btn.addKeyListener(this); // 重新要求監聽
86 }// processOtherKey(
87 TextArea ta = new TextArea(" ", 2, 32); //用來抓住 KeyEvent
88 }//class
以下是與你用 java -cp kt.jar tk 看到的類似之 Applet:
或者拿這個 Lab10.java 去修改 (解壓縮 kt.jar後就有這Lab10.java檔案):
01 //Lab10.java -- test KeyListener, by tsaiwn@cs.nctu.edu.tw
02 //要使用KeyListener很簡單, 阿就該GUI元件 .addKeyListener(gy);
03 //這裡的 gy 是有能力處理 KeyEvent 的物件, 這例子是寫 this,
04 //因為 this class 有 implements KeyListener 也有寫對應的三個函數
05 //請注意, Focus 必須在該被監聽的圖形元件才有用喔
06 import java.applet.*;
07 import java.awt.*;
08 import java.awt.event.*;
09 import javax.swing.*;
10 public class Lab10 extends Applet implements KeyListener {
11 int totalHit = 0;
12 public static final Color aaColor = Color.cyan;
13 static Lab10 me; // 照我這種寫法就可以當作 Applet + Application
14 Button btn; Panel p= new Panel( );
15
16 public static void main(String xx[ ]) {
17 me = new Lab10( );
18 me.init( ); me.start( );
19 JFrame f = new JFrame( );
20 f.setDefaultCloseOperation(3); // 按右上角 x 會關掉
21 f.add(me, "Center"); f.setSize(500,300);
22 f.setVisible(true);
23 } // main(
24 public void init( ) {
25 btn = new Button(" ");
26 add(p); // Panel
27 add(ta); // ta 是 TextArea
28 add( new Label("按abc123和各種鍵看看") );
29 p.add(btn); p.setPreferredSize( new Dimension(98,38) );
30 p.setBackground( Color.yellow );
31 btn.setBackground( aaColor );
32 btn.setFont( new Font("標楷體", 1, 24) ); // 1 == 粗體
33 btn.addKeyListener(this); // 要求監聽
34 //btn.requestFocus( ); // 使得不必用滑鼠點一下
35 } // init(
36 public void paint(Graphics g) {
37 System.out.println("; Total hit =" + totalHit);
38 btn.requestFocus( ); // 把 focus 拉回來
39 }//paint(
40
41 ////// 以下三個函數是 KeyListener 的 functions (函數; 函式)
42 public void keyPressed(KeyEvent e) { ++totalHit;
43 System.out.println("KeyEvent = " + e);
44 int k = e.getKeyCode( );
45
46 } // keyPressed(
47 public void keyReleased(KeyEvent e) {
48 int k = e.getKeyCode( );
49 System.out.println(" KeyCode=" + k);
50 } // keyReleased
51 public void keyTyped(KeyEvent e) {
52 } // 有意義的字才會到這function
53
54 ////// 做比較多事情就抽出來另外放函數(函式)!
55 static final String myMSG = "這是我的心得\n第二列 ..."
56 + "\n這是第三列...";
57 TextArea ta = new TextArea(myMSG, 5, 28); //用來抓住 KeyEvent
58 }//class
抓這 LAB10 全部的壓縮檔Lab10.jar (zip格式)
抓 BATNUM 新改的Java版:
bat7.java
+
c2java.java (可用在把 C改為 Java簡化工作)
回到作業目錄
回到課程目錄
You are the
-th visitors to this page.