日期:2014-05-20  浏览次数:20685 次

J2ME: 由用户自行设置键值
众所周知,j2me的手机键值的处理是令人头痛的一件事,要使一个j2me应用适配所有的手机键盘简直是不可能完成的任务,要达到这个目的,唯一的途径是由用户自行设置键值。
以下提供一个用户设置键值的类,经测试效果不错。
public class GetKey extends Canvas{
	private int fh;
	private int lastKey = 0;
	private Display display;
	private Displayable backScreen;
	private TextField setKey;
	
	public GetKey(TextField theSetKey){
		fh = Font.getDefaultFont().getHeight() + 4;
		setKey = theSetKey;
		lastKey = Integer.parseInt(setKey.getString());
	}
	
	public void show(Display theDisplay){
		display = theDisplay;
		backScreen = display.getCurrent();
		display.setCurrent(this);
	}
	
	protected void paint(Graphics g) {
		g.setColor(0);
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(0xffffff);
		g.drawString("Press the key:", 2, fh*0, Graphics.TOP|Graphics.LEFT);
		g.drawString("press < to cancel,", 2, fh*1, Graphics.TOP|Graphics.LEFT);
		g.drawString("press > to save.", 2, fh*2, Graphics.TOP|Graphics.LEFT);
		
		g.setColor(0xff0000);
		g.drawString(String.valueOf(lastKey), getWidth()/2, getHeight()/2, Graphics.HCENTER|Graphics.TOP);
	}
	
	// 响应按键
	protected void keyPressed(int keyCode) {
		if (keyCode <= 0) {
			int gameAction = getGameAction(keyCode);
			if (gameAction != 0) {
				keyCode = gameAction;
			}
		}
		switch(keyCode){
		case Canvas.RIGHT:
			setKey.setString(String.valueOf(lastKey));
		case Canvas.LEFT:
			display.setCurrent(backScreen);
			return;
		default:
			lastKey = keyCode;
		}
		
		repaint();
		serviceRepaints();
	}	
}


注意其中的关键是要在构建函数中传入用于保存用户所设按键的TextField!

更正:应设为全屏,否则有一些键可能读不到!
1 楼 Saito 2009-05-26  
如果你设置键值的那几个键都不支持怎么办. 那还不是不能设置?
2 楼 iwinyeah 2009-05-26  
Saito 写道

如果你设置键值的那几个键都不支持怎么办. 那还不是不能设置?

我不太明白你的意思,如果是指保存设置的左右方向键的话,是所有手机都实现了的。
3 楼 iwinyeah 2009-05-26  
而且你也不大可能使用方向键去实现与方向无关的功能吧
4 楼 Saito 2009-05-26  
假设. 我的手机要使用你的 游戏 ..

         那照你的程序. 我就必须首先进入游戏. 然后进入设置键位栏目..

         那万一我连设置键位那栏都进不去呢. 比如说我的方向键 下 . 不支持. 怎么办?
5 楼 iwinyeah 2009-05-26  
找这样一个手机给我看看(这意味着手机不支持TextField,Command,Form...,那它还可以说自己支持j2me吗?)
6 楼 Saito 2009-05-26  
iwinyeah 写道

找这样一个手机给我看看(这意味着手机不支持TextField,Command,Form...,那它还可以说自己支持j2me吗?)

  我手机玩Gameloft的游戏 经常摇杆的下 键不能使.
7 楼 iwinyeah 2009-05-26  
Saito 写道

iwinyeah 写道
找这样一个手机给我看看(这意味着手机不支持TextField,Command,Form...,那它还可以说自己支持j2me吗?)&nbsp; 我手机玩Gameloft的游戏 经常摇杆的下 键不能使.

对不起,这里不负责修理手机
8 楼 Saito 2009-05-26  
iwinyeah 写道

Saito 写道
iwinyeah 写道
找这样一个手机给我看看(这意味着手机不支持TextField,Command,Form...,那它还可以说自己支持j2me吗?)&amp;nbsp; 我手机玩Gameloft的游戏 经常摇杆的下 键不能使.

对不起,这里不负责修理手机

   是键位不对. 不是我手机坏了
9 楼 iwinyeah 2009-05-26  
Saito 写道

iwinyeah 写道
Saito 写道iwinyeah 写道找这样一个手机给我看看(这意味着手机不支持TextField,Command,Form...,那它还可以说自己支持j2me吗?)&amp;amp;nbsp; 我手机玩Gameloft的游戏 经常摇杆的下 键不能使. 对不起,这里不负责修理手机&nbsp;&nbsp; 是键位不对. 不是我手机坏了


牛皮灯笼啊,你要使用高级UI来设置!

	public void commandAction(Command cmd, Item item) {
		if(item == uiMenuKey){
			GetKey keyCanvas = new GetKey((TextField)item);
			keyCanvas.show(controler.getDisplay());
		}
	}