キー入力
メモ
GC Java Packいれたので、J2MEプログラムをお試し中
とり合えずキー入力(QWERTYでの)確認
まずはMIDletクラスを継承したクラスを作成。
package dev.test; import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class J2METest extends MIDlet { KeyCanvas canvas; Thread thread; public J2METest() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { canvas = new KeyCanvas(false); Display.getDisplay(this).setCurrent(canvas); thread = new Thread(canvas); thread.start(); } }
次にGameCanvasを継承したクラスを作成
package dev.test; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; public class KeyCanvas extends GameCanvas implements Runnable{ int keyCode = 0; protected KeyCanvas(boolean suppressKeyEvents) { super(suppressKeyEvents); } public void run() { Graphics g = getGraphics(); System.out.println("Start Thread."); String[][] keyImg = new String[][]{ {"1","2","3","4","5","6","7","8","9","0","-","^","\\","BACK_SPACE"} ,{"Q","W","E","R","T","Y","U","I","O","P","@","[", "ENTER"} ,{"A","S","D","F","G","H","J","K","L",";",":","]"} ,{"Z","X","C","V","B","N","M",",",".","/","\\","LEFT","RIGHT","UP","DOWN"} ,{"SPACE"} }; String msg; while(true){ int key = getKeyStates(); g.setColor(0xFF,0xFF,0xFF); g.fillRect(0,0,getWidth(),getHeight()); String strKey = ""; if(key != 0){ try{ strKey = getKeyName(key); }catch(IllegalArgumentException iae){ strKey = "unknow"; } } if(keyCode != 0){ try{ strKey = getKeyName(keyCode); }catch(IllegalArgumentException iae){ strKey = "unknow"; } } for(int i = 0; i < keyImg.length; i++){ for(int j = 0; j < keyImg[i].length; j++){ if((strKey.length() > 0) && strKey.equals(keyImg[i][j])){ g.setColor(0xFF,0x00,0x00); }else{ g.setColor(0x00,0x00,0xFF); } g.drawString(keyImg[i][j], j * 12 + 10, i * 12 + 10, Graphics.BASELINE | Graphics.LEFT); } } msg = "input code = "; msg = msg + strKey; msg = msg + " "; msg = msg + Integer.toString(keyCode); msg = msg + "/"; msg = msg + Integer.toString(key); g.setColor(0x00,0x00,0xFF); g.drawString(msg, 10, 12 * 5 + 10, Graphics.BASELINE | Graphics.LEFT); flushGraphics(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } protected void keyPressed(int keyCode) { super.keyPressed(keyCode); this.keyCode = keyCode; } protected void keyReleased(int keyCode) { super.keyReleased(keyCode); this.keyCode = 0; } protected void keyRepeated(int keyCode) { super.keyRepeated(keyCode); this.keyCode = keyCode; } }
LEFTとかRIGHTとかの表示がかぶっちゃうけど、面倒なので直さず。
canvas = new KeyCanvas(false);
の引数をtrueにすると、AやDのキーコードがkeyPressed()などで取れなくなります。(JavaDocはまともに読んでいないのでなぜかは知りません。)
J2MEのエミュレータではエミュレータ上のキーはすべて認識。
さて、HT-01Aで動かしてみます。
動きました。
J2MEのエミュレータとHT-01A(GC Java Packだから?)では違いがあります。
HT-01A基準で
- HT-01Aでは大文字、小文字を認識する。J2MEはCapsLockの状態にかかわらず大文字
- BACK_SPACEがCLEAR
- エミュレータにないキーも認識(@など)
- ENTERがSELECT
簡単に試した結果なのでもっとあるかもしれません。
Windows Mobileのエミュレータがうまく動かないので、J2MEでなにか作るのもいいかも。
Windows Mobileで動くアプリはいろいろあるけど、画面サイズにあうアプリって少なすぎる・・・まぁ、仕方がないけど。