首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java AWT 圖形界面實戰:鍵盤控制小球移動與接口機制深度講解

     編輯:Java 綜合教學

從硬件事件到程序回調:接口的由來

用戶按鍵 → 鍵盤控制器 → 作業系統 → JVM。JVM 需將事件通知給我們的程序,唯一途徑是**約定一個方法讓系統調用**。為了統一規範,Java 引入接口:純抽象類型,定義「必須實現的方法契約」,編譯器強制檢查實現類是否覆寫所有抽象方法。這正是「項目經理與開發者」、「前人與後人」之間的強制性約定。

鍵盤事件接口:KeyListener

位於 java.awt.event 包,包含三個方法:

  • keyPressed(KeyEvent e):鍵按下(底層,識別物理鍵)。
  • keyReleased(KeyEvent e):鍵釋放。
  • keyTyped(KeyEvent e):字符輸入(處理組合鍵如 Shift+A)。

完整實現步驟

1. 實現接口

class MyOval extends Panel implements KeyListener {
    int x = 30, y = 30; // 小球座標
    public void paint(Graphics g) {
        g.fillOval(x, y, 20, 20);
    }
    // IDE 可自動生成三個方法存根
    @Override public void keyTyped(KeyEvent e) {}
    @Override public void keyPressed(KeyEvent e) { ... }
    @Override public void keyReleased(KeyEvent e) {}
}

2. 註冊事件監聽器

事件源是窗體,但焦點可能在面板上,需雙重註冊:

Frame w = new Frame();
MyOval mp = new MyOval();
w.add(mp);
w.addKeyListener(mp); // 窗體註冊
mp.addKeyListener(mp); // 面板自身註冊,防止焦點丟失
w.setSize(300, 400);
w.show();

3. 編寫事件處理邏輯

利用 KeyEvent 獲取按鍵碼:

  • e.getKeyChar():字符(字母/數字鍵)。
  • e.getKeyCode():虛擬鍵碼(方向鍵:左 37、上 38、右 39、下 40)。
@Override
public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
        case 37: x--; break; // 左
        case 38: y--; break; // 上
        case 39: x++; break; // 右
        case 40: y++; break; // 下
    }
    repaint(); // 觸發重繪
}

調試技巧:System.out.println 探索未知

在不確定的方法中打印參數對象 e 或調用 e.getKeyCode(),觀察控制台輸出,快速掌握 API 行為。

完整可運行代碼

import java.awt.*;
import java.awt.event.*;

public class MyBall {
    public static void main(String[] args) {
        Frame w = new Frame();
        w.setSize(300, 400);
        MyOval mp = new MyOval();
        w.add(mp);
        w.addKeyListener(mp);
        mp.addKeyListener(mp);
        w.show();
    }
}

class MyOval extends Panel implements KeyListener {
    int x = 30, y = 30;
    public void paint(Graphics g) {
        g.fillOval(x, y, 20, 20);
    }
    @Override public void keyTyped(KeyEvent e) {}
    @Override public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case 37: x--; break;
            case 38: y--; break;
            case 39: x++; break;
            case 40: y++; break;
        }
        repaint();
    }
    @Override public void keyReleased(KeyEvent e) {}
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved