請注意: 做好習題請到本題討論版依照規定 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 free hit counters -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 free hit counters -th visitors to this page.