java使用KeyButton.doc_第1页
java使用KeyButton.doc_第2页
java使用KeyButton.doc_第3页
java使用KeyButton.doc_第4页
java使用KeyButton.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Key Button目标:学会key event/学会event handling上一讲我们使用Canvas进行了粗略的制图,掌握的差不多了吧。是的。学会了画四边形和圆形。本讲我们将制作通过终端按键显示graphic的程序。1. Event handing上一讲所作的程序只能在画面中显示图像是吧。是啊。图像显示完就没有了,让人觉得好像不充实啊。一般的终端应用,大多都可以利用操作按键来完成interactive动作。例如,按方向键操作角色移动;按确定键发射子弹等。的确,游戏都是这个样子的。这么说,时钟程序也可以利用按键来调时间了吧。恩,不仅仅限于终端程序,PC不也是利用鼠标点击来执行文件或者用按键来实现interactive动作么?这样的例子很多啊。是啊。这样想来,许多地方都在使用按键输入呢。像这样通过按键输入或者点击鼠标来执行命令是计算机的一个特征。用户通过按键、鼠标输入的命令叫做event,对event进行处理叫做event handing。2. Key event2.1. 模板先来看一下本讲使用的模板程序。我们将书写在这个程序里面。23import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Display;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;/* * 初级讲座第八讲模板程序 * */public class TempleteApp extends MIDlet private Display display;private Canvas keyCanvas;/* * constructor */public TempleteApp()display = Display.getDisplay(this);keyCanvas = new TempleteCanvas();/* * 开始应用程序 */protected void startApp() throws MIDletStateChangeException display.setCurrent(keyCanvas);protected void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Graphics;/* * 模板Canvas * 付key event处理方法 */public class TempleteCanvas extends Canvas /* * constructor */public ChangeImageCanvas()/* * 描画用方法 */protected void paint(Graphics g) /* * key event处理 */* * 键被按下时的处理 */protected void keyPressed(int keyCode) /在这里记述处理/* * 离开键时的处理 */protected void keyReleased(int keyCode) /在这里记述处理 /* * 连续按键时的处理 */protected void keyRepeated(int keyCode) /在这里记述处理2.2. 处理key event的方法 本讲的模板程序与上一讲有一些不一样,看出来了么?呵呵,程序变长了。不光是这个拉!为什么变长知道么?恩,Canvas里面的方法增多了这就对了。在“key event处理”comment下面的三个方法是新增的。这里的方法是进行key event处理的。它们各自的作用如下所示。方法作用int keyPressed(int keyCode)键被按下时的处理int keyReleased(int keyCode)离开键时的处理int keyRepeated(int keyCode)连续按键时的处理“离开键时”是指从键被按下的状态离开时么?恩。对了。2.3. keyCode那么。上面key event处理的自变量里面的“keyCode”,指的是什么呀?恩,问的好。终端的按键含有不同分工的keycode。用表概括一下,如下所示。KeyKeyCodeKeyCode的值0Canvas.KEY_NUM0481Canvas.KEY_NUM1492Canvas.KEY_NUM2503Canvas.KEY_NUM3514Canvas.KEY_NUM4525Canvas.KEY_NUM5536Canvas.KEY_NUM6547Canvas.KEY_NUM7558Canvas.KEY_NUM8569Canvas.KEY_NUM957*Canvas.KEY_STAR42#Canvas.KEY_POUND35在Key event处理的自变量里面,代入这些keycode。比如按“8”键时,方法的“keycode”里面要代入“Canvas.KEY_NUM8”对么?恩,是的。利用这个给定的keycode值,就能够判断究竟按了哪一个键。2.4. Game action可是刚才的表里面好像没有方向键啊?好厉害呀,小尼克!这是因为方向键被定义为Game action。Game action?啊,这个与KeyCode很相似啊。分为方向键和确定键。使用以下的方法从KeyCode里面获得Game action。int getGameAction(keyCode);Game actionKeyCodeKeyCode的值UP-1DOWN-2LEFT-3RIGHT-4FIRE-5GAME_AKEY_NUM755GAME_BKEY_NUM957GAME_CKEY_STAR42GAME_DKEY_POUND352.5. key的判定下面我们就来作进行“”key判定的程序。在“keyPressed”方法里根据“keyCode”值的不同,书写条件分歧的程序就可以了。/* * 键被按下时的处理 */protected void keyPressed(int keyCode) String key =;/被按的键/判定被按的键switch(keyCode)case Canvas.KEY_NUM0:key = 0;break;case Canvas.KEY_NUM1:key = 1;break;case Canvas.KEY_NUM2:key = 2;break;case Canvas.KEY_NUM3:key = 3;break;case Canvas.KEY_NUM4:key = 4;break;case Canvas.KEY_NUM5:key = 5;break;case Canvas.KEY_NUM6:key = 6;break;case Canvas.KEY_NUM7:key = 7;break;case Canvas.KEY_NUM8:key = 8;break;case Canvas.KEY_NUM9:key = 9;break;default:break;/在message panel里输出结果System.out.println(“被按下的是”key +);像这样使用switch语句很简单吧。是啊。然后分别记述想要进行的处理就OK了。没错!3. 变换图像程序 接下来我们来制作变换图像的程序吧。这是什么程序啊?通过按按键来显示图像,不同按键显示的图像不一样。也就是显示不同图像的程序。其实很简单的。呃,是这样啊,不知道好不好学3.1. 准备图像下面5个就是我们使用的图像。把这些图像分别分工给按键,那么分给哪些呢?恩,方向键怎么样呢?恩,不错。使用方向键的机会多,正好合适。如下表所示进行分配。Key图像按键没有被按下的状态(java0.png)(java1.png)(java2.png)(java3.png)(java4.png)3.2. 显示图像下面就该显示图像了。还记得怎么做么?首先,读取图像数据。然后把图像在anchor point指定的位置上显示出来恩,对。就是这样吧?/* * 描画用方法 */protected void paint(Graphics g) Image image;try image = Image.createImage(java0.png); catch (IOException e) e.printStackTrace();/显示图像 g.drawImage(image, 50, 50, Graphics.HCENTER | Graphics.VCENTER);呵呵,例外处理用的很熟练呀。3.3. 变换图像 3.4. scope与instance自变量那么,应该怎样进行图像的变换呢?键被按下时,读取图像数据进行显示,是这样的么?虽说是这样的,但是现在却显示不出来。尼克你准备怎么进行编程呢?恩,在“keyPressed”方法里写switch语句,在其中读取图像数据,显示图像的处理啊?显示图像的处理是?是啊,显示图像的处理必须要写在描画方法的paint方法中。这样的话,图像还是不能被显示出来啊说这样的话还为时过早,先来看一下paint方法中显示图像的这部分吧。g.drawImage(image,50,50,Graphics.HCENTER|Graphics.VCENTER);看明白了吧,这里使用了保存图像数据的变量image。键被按下时对变量进行变更就可以了。哈哈,还是可以做出来的!那你就做做看吧。是这样吧。import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Display;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;/* * 变换图像程序 * */public class TempleteApp extends MIDlet private Display display;private Canvas keyCanvas;/* * constructor */public TempleteApp()display = Display.getDisplay(this);keyCanvas = new TempleteCanvas();/* * 开始程序 */protected void startApp() throws MIDletStateChangeException display.setCurrent(keyCanvas);protected void pauseApp() protected void destroyApp(boolean arg0) throws MIDletStateChangeException import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Graphics;/* * 模板Canvas * 付key event处理方法 */public class TempleteCanvas extends Canvas /* * constructor */public ChangeImageCanvas()try Image image = Image.createImage(java0.png); catch (IOException e) e.printStackTrace();/* * 描画用方法 */protected void paint(Graphics g) /变量宣言Image image;/显示图像g.drawImage(image, 50, 50, Graphics.HCENTER | Graphics.VCENTER);/* * key event处理 */* * 键被按下时的处理 */protected void keyPressed(int keyCode) try switch (getGameAction(keyCode) case Canvas.UP :Image image = Image.createImage(java1.png);break;case Canvas.DOWN :Image image = Image.createImage(java2.png);break;case Canvas.RIGHT :Image image = Image.createImage(java3.png);break;case Canvas.LEFT :Image image = Image.createImage(java4.png);break;default :break; catch (Exception e) e.printStackTrace();/* * 离开键时的处理 */protected void keyReleased(int keyCode) /* * 连续按键时的处理 */protected void keyRepeated(int keyCode) 下面就先让我们试着进行编译吧。好!啊?出现了编译error恩,尼克,这个error是因为在同一个block对相同名字的变量进行了宣言引起的。恩这么说,在switch语句中进行了四次相同的变量宣言啊。纠正过来是不是就可以了?首先考虑一下为什么会导致这样的错误呢?好。呃,在switch语句中各按键被按下时,在image里代入各种各样的图像数据。这是因为想把image用paint方法显示出来。尼克,变量宣言与准备新的容器是一样的。尼克印象中,同样的容器把内容换一下就可以了,但是这个程序每次写switch语句都要准备新的容器。对啊!是这样的啊,这样就不用变量宣言了,那变量宣言到底用在哪里呢?恩,问的不错。首先,先来对变量scope进行一下说明。在变量里面各自都有“有效范围”。有效范围?变量可以使用的范围么?是的。把有效范围就叫做scope。变量的scope只存在于进行变量宣言的block内。图中的黄色部分就是变量a的scope。在Test2方法中不能使用变量a。 是这样的啊。那么各方法在使用变量时应该怎么做好呢?在类的正下方记录变量宣言就可以了。这样在类中就可以全部使用相同的变量。这样的类中全部可以使用的变量就被称为instance变量。变量a在类的scope的正下方进行宣言,因此就是instance变量。变量a的scope就是图中黄色部分。把保存图像数据的image做成instance变量,Canvas如下所示。import java.io.IOException;import javax.microedition.lcdui.Canvas;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;/* * 变换图像程序Canvas * */public class ChangeImageCanvas extends Canvas Image image;/保存图像数据的变量/* * construtor */public ChangeImageCanvas()try image = Image.createImage(java0.png); catch (IOException e) e.printStackTrace();/* * 描画用方法 */protected void paint(Graphics g) /显示图像g.drawImage(image, 50, 50, Graphics.HCENTER | Graphics.VCENTER);/* * key event处理 */* * 键被按下时的处理 */protected void keyPressed(int keyCode) try switch (keyCode) case Canvas.UP :image = Image.createImage(java1.png);break;case Canvas.DOWN :image = Image.createImage(java2.png);break;case Canvas.RIGHT :image = Image.createImage(java3.png);break;case Canvas.LEFT :image = Image.createImage(java4.png);break;default :break; catch (Exception e) e.printStackTrace();/* * 离开键时的处理 */protected void keyReleased(int keyCode) /* * 连续按键时的处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论