用戶按鍵 → 鍵盤控制器 → 作業系統 → JVM。JVM 需將事件通知給我們的程序,唯一途徑是**約定一個方法讓系統調用**。為了統一規範,Java 引入接口:純抽象類型,定義「必須實現的方法契約」,編譯器強制檢查實現類是否覆寫所有抽象方法。這正是「項目經理與開發者」、「前人與後人」之間的強制性約定。
位於 java.awt.event 包,包含三個方法:
keyPressed(KeyEvent e):鍵按下(底層,識別物理鍵)。keyReleased(KeyEvent e):鍵釋放。keyTyped(KeyEvent e):字符輸入(處理組合鍵如 Shift+A)。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) {}
}
事件源是窗體,但焦點可能在面板上,需雙重註冊:
Frame w = new Frame();
MyOval mp = new MyOval();
w.add(mp);
w.addKeyListener(mp); // 窗體註冊
mp.addKeyListener(mp); // 面板自身註冊,防止焦點丟失
w.setSize(300, 400);
w.show();
利用 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(); // 觸發重繪
}
在不確定的方法中打印參數對象 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) {}
}