MIDP 低級事件:keyPressed、keyReleased、keyRepeated。並非所有設備支援 keyRepeated,可用 hasRepeatEvents() 檢測。若不支援,需自行實現長按邏輯。
核心思路:keyPressed 置位,keyReleased 清位,獨立線程輪詢標志位執行持續動作。
// 成員變量
private boolean leftPressed, rightPressed;
private int px = getWidth()/2, py = getHeight()/2;
private String btn = "";
// keyPressed
public void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch(action) {
case LEFT: left(); leftPressed=true; break;
case RIGHT: right(); rightPressed=true; break;
}
repaint();
}
// keyReleased
public void keyReleased(int keyCode) {
int action = getGameAction(keyCode);
switch(action) {
case LEFT: leftPressed=false; btn=""; break;
case RIGHT: rightPressed=false; btn=""; break;
}
repaint();
}
// 獨立線程 run()
public void run() {
while(true) {
if (leftPressed) left();
if (rightPressed) right();
try { Thread.sleep(50); } catch(InterruptedException e){}
}
}
// 移動邏輯
private void left() { if(px>=0) px--; btn="LEFT"; repaint(); }
private void right() { if(px<=getWidth()) px++; btn="RIGHT"; repaint(); }
// paint()
public void paint(Graphics g) {
g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0x000000);
g.drawString(btn, 20,20, Graphics.LEFT|Graphics.TOP);
g.drawString("J2ME", px, py, Graphics.HCENTER|Graphics.TOP);
}
// keyRepeated(設備支援時調用)
public void keyRepeated(int keyCode) {
int action = getGameAction(keyCode);
switch(action) { case LEFT: left(); break; case RIGHT: right(); break; }
repaint();
}
代碼見原文,效果:長按左右鍵,「J2ME」字符串持續平滑移動,頂部顯示當前按鍵狀態。

keyRepeated 支援,通用性強。