最近在做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的话又会出现上面的问题。烦啊~烦