キー入力

メモ
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で動くアプリはいろいろあるけど、画面サイズにあうアプリって少なすぎる・・・まぁ、仕方がないけど。