最近在做j2me時遇到了一個問題,怎麼也解決不了,現在把問題列出來,希望有遇過這種問題的人能夠告訴我解決的方法。
問題是這樣子的,我在一個GameCanvas實現了Runnable和CommandListener接口,並加入了多個的Command,而且裏面有一個方法使用getKeyStates()取得用戶的輸入並進行相應的處理。運行時,如果我不按Command,則一切正常,如果選擇某一個Command(要按到Fire鍵)則以後getKeyStates()方法總會得到Fire鍵,即使我之後並沒有按任何的鍵。
給出一個這種例子的代碼:
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.*;
public class TestCanvas extends GameCanvas implements Runnable,CommandListener{
private final Command c1 = new Command("Command1",Command.OK,0);
private final Command c2 = new Command("Command2",Command.OK,1);
private final Command c3 = new Command("Command3",Command.OK,2);
private final Command c4 = new Command("Command4",Command.OK,3);
private final Command c5 = new Command("Command5",Command.OK,4);
public TestCanvas(){
super(true);
addCommand(c1);
addCommand(c2);
addCommand(c3);
addCommand(c4);
addCommand(c5);
setCommandListener(this);
}
public void input(){
int keyState = this.getKeyStates();
if(keyState == 0) return;
if((keyState&LEFT_PRESSED)!=0){
System.out.println(keyState);
System.out.println("Left");
}else if ((keyState&RIGHT_PRESSED)!=0){
System.out.println(keyState);
System.out.println("Right");
}else if ((keyState&DOWN_PRESSED)!=0){
System.out.println(keyState);
System.out.println("Down");
}else if ((keyState&UP_PRESSED)!=0){
System.out.println(keyState);
System.out.println("Left");
}else if ((keyState&FIRE_PRESSED)!=0){
System.out.println(keyState);
System.out.println("Fire");
}else {
System.out.println(keyState);
System.out.println("other");
}
}
public void run() {
while(true){
input();
try{
Thread.sleep(100);
}catch(InterruptedException e){
}
}
}
public void commandAction(Command c, Displayable d){
}
}
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class TestMIDlet extends MIDlet {
public TestMIDlet() {
// TODO Auto-generated constructor stub
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO Auto-generated method stub
}
protected void pauseApp() {
// TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
TestCanvas canvas = new TestCanvas();
Display.getDisplay(this).setCurrent(canvas);
Thread t = new Thread(canvas);
t.start();
}
}
實際上,用keyPressed和keyReleased可以很好地解決這個問題,可是又很實現連續按鍵,而用keyRepeated的話又會出現上面的問題。煩啊~煩