本實例實現鍵盤方向鍵控制小球上下左右移動,鬆開按鍵自動歸位。核心技術點:KeyListener 接口實現、鍵碼映射、焦點管理與重繪觸發。
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyListenerDemo {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setSize(800, 800);
frame.setBackground(Color.BLACK);
MyPanel myPanel = new MyPanel();
frame.add(myPanel);
// 關鍵:同時註冊到 Frame 和 Panel 確保獲取焦點
frame.addKeyListener(myPanel);
myPanel.addKeyListener(myPanel);
frame.show();
}
}
class MyPanel extends Panel implements KeyListener {
int x = 150;
int y = 150;
@Override
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillOval(x, y, 20, 20);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case 37: x--; break; // 左
case 38: y -= 10; break; // 上
case 39: x += 10; break; // 右
case 40: y += 10; break; // 下
}
repaint(); // 必須調用觸發重繪!
}
@Override
public void keyReleased(KeyEvent e) {
// 鬆開按鍵歸位
x = 150;
y = 150;
repaint();
}
@Override
public void keyTyped(KeyEvent e) { /* 不使用 */ }
}
frame.addKeyListener() + panel.addKeyListener() 解決焦點獲取問題KeyEvent.VK_LEFT 等常量提高可讀性paint() 重繪keyPressed 處理移動,keyReleased 處理歸位邏輯
KeyEvent.VK_* 常量替換魔術數字JPanel + KeyBinding) 獲得更好焦點管理此例為 Java 事件驅動編程入門範本,掌握監聽器模式、事件分發、繪圖更新三大核心機制。