手机
当前位置:查字典教程网 >编程开发 >JSP教程 >通过实例论证J2ME的事件传输机制
通过实例论证J2ME的事件传输机制
摘要:本文主要阐述的问题是,在J2ME开发中事件传输到底是什么机制。主要围绕Canvas类事件传输的串行化进行分析和研究,通过实例进行论证并在最后...

本文主要阐述的问题是,在J2ME开发中事件传输到底是什么机制。主要围绕Canvas类事件传输的串行化进行分析和研究,通过实例进行论证并在最后得出结论。

通过参考Java doc我们可以知道在J2ME中的事件传输是串行化的,那么什么是串行化呢?java doc里面说当一个时间方法调用完成之后,下面的事件方法才会被调用。这样可以保证用户的上次输入已经被完成了,下次的事件输入才会得到响应。首先我们来看看那些方法是所谓的事件方法。在MIDP中列出了如下的方法:

showNotify()
hideNotify()
keyPressed()
keyRepeated()
keyReleased()
pointerPressed()
pointerDragged()
pointerReleased()
paint()
the CommandListener's commandAction() method

我们针对上述串行化的理解不防做一下这样的假设,当showNotify()方法被调用的时候,如果在内部定义了repaint()方法,则会请求系统对屏幕进行重新的绘制,这会调用到paint()方法。接下来我们实现keyPressed()方法,让它把按键的名字打印在屏幕上。为了模拟串行化的效果,我们在每个方法中都让当前的线程睡眠2000ms,如果事件的确是串行化的机制,那么程序一定会断断续续的画出我们的按键名。为了论证我们的设想,我编写了下面的一段代码。


import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class KeyCodes extends MIDlet

{

private Display display;

private KeyCodeCanvas canvas;

public KeyCodes()

{

display = Display.getDisplay(this);

canvas = new KeyCodeCanvas(this);

}

protected void startApp()

{

display.setCurrent(canvas);

}

protected void pauseApp()

{

}

protected void destroyApp(boolean unconditional)

{

}

public void exitMIDlet()

{

destroyApp(true);

notifyDestroyed();

}

}

class KeyCodeCanvas extends Canvas implements CommandListener

{

private Command cmExit;

private String keyText = "hello let's go!";

private KeyCodes midlet;

public KeyCodeCanvas(KeyCodes midlet)

{

this.midlet = midlet;

cmExit = new Command("Exit", Command.EXIT, 1);

addCommand(cmExit);

setCommandListener(this);

}

protected void paint(Graphics g)

{

System.out.println("I am invoked!");

g.setColor(0, 255, 0);

g.fillRect(0, 0, getWidth(), getHeight());

if (keyText != null)

{

g.setColor(0, 0, 0);

g.drawString(keyText, getWidth() / 2, getHeight() / 2, Graphics.TOP

| Graphics.HCENTER);

}

}

public void showNotify()

{

repaint();

try

{

Thread.sleep(2000);

}

catch(InterruptedException e)

{

}

}

public void commandAction(Command c, Displayable d)

{

if (c == cmExit)

midlet.exitMIDlet();

}

protected void keyPressed(int keyCode)

{

keyText = getKeyName(keyCode);

repaint();

try

{

Thread.sleep(2000);

}

catch(InterruptedException e)

{

}

}

}

编译,运行。我们看到当Canvas被显示在屏幕上的时候,showNotify()方法首先被调用,它的repaint()方法被调用后,并不是屏幕马上会被绘制。而是要等两秒的时间,showNotify()方法返回后,paint()方法才开始执行。在这两秒的时间,即使你按键屏幕同样不会重新绘制,相反你的按键事件会被缓存到一个队列,一个一个的被慢慢的绘制出来。下面是程序的截图,供参考

通过实例论证J2ME的事件传输机制1

在Canvas类的java doc中有一个备注说明了一些值得关注的问题,比如serviceRepaints()方法会强迫任何挂起的绘画请求立刻被执行,showNotify()和hideNotify()方法使用的一些注意等,读者可以参考java doc了解进一步的内容。


【通过实例论证J2ME的事件传输机制】相关文章:

JSP与XML的交互有哪些

JavaBean实现多文件上传的两种方法

纯JSP+DWR实现三级联动下拉选择菜单实现技巧

一个用JSP做的日历

根据Hibernte的cfg文件生成sql文件

JSP的出错处理

初探Java类加载机制

我认为JSP有问题(上)

JSP分页显示的实例代码

Apache+Servlet+Jsp环境设置(上)

精品推荐
分类导航