關於j2me的一個按鍵問題

最近在做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的話又會出現上面的問題。煩啊~煩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章