介绍
在这一章,我们将学习 KJava 事件处理,并用简单的绘图应用程序 Scribble 来示范它是如何工作的。
KJava 事件处理模型不如 J2SE 的 action-listene 模型先进。通过使 Spotlet 类子类化,所有感兴趣的事件都是可访问的,无论怎样,KJava 应用程序都将完成这项工作。目前,只有 spotlet 受到了事件的关注。为了关注 spotlet,我们使用 register()。如要停止,则使用 unregister()。
注意:如果您用 WANT_SYSTEM_KEYS 注册一个 spotlet ,设备不会通过按下按钮和排队等候停止它的应用程序来自动终止这个应用程序。相反,按下按钮事件会通报这个应用程序,然后负责适当地处理事件。除非当按下按钮时您提供一种通过调用 System.exit 终止应用程序的方法,否则这个应用程序将会继续不确定地运行。唯一能终止这个应用程序的方法就只有重启该设备。
KJava 支持三种基本类型事件:显示屏上笔的移动、键盘输入和电子束定向发送/接收。另外,还有一种全面的包罗万象的方法 —— unknownEvent()。在后面的章节中我们将讨论这些不同的事件类型。
处理笔的移动
处理 PDA 显示器上笔的移动的事件处理程序有:penDown、penMove 和 penUp.
当用户将笔在显示器上移动时,penDown() 方法将被调用,它传递显示器上笔的放置点的 X 和 Y 轴坐标。
public void penDown( int x, int y )
当用户在显示器上移动笔时 penMove() 过程将被调用。X 和 Y 轴坐标定义笔的当前位置。
public void penMove( int x, int y )
当用户将笔从显示器上移开时 penUp() 过程将被调用,它传递两个参数:笔被移开点的 X 和 Y 轴坐标。
public void penUp( int x, int y )
处理键盘输入,电子束定向发送/接收,以及未知事件
在 J2SE AWT 中,接口 java.awt.event.KeyListener 包含处理不同键盘事件的 keyPressed、keyReleased 和 keyTyped.与此相比,KJava 则只有一个函数,keyDown()。
如果用户在可书画区写下一个字符,按下计算器或菜单图标,或者是按下任何"硬键"(缺省情况下,Date Book、Address、page up、page down、To Do List 或是 Memo Pad key )时,事件 keyDown 就会被调用。参数 keyCode 标识用户输入的键的代码。如果按了其中一个"硬键",事件 keyDown 就开始匹配这个类中定义过的相应常量中的一个。
public void keyDown( int keyCode )
beamReceive() 方法被用于接收从红外线 Palm 设备传来的数据包。数据以一种字节数组的方式被接收,并用虚拟机自动分配这些数据。
public static boolean beamReceive( byte[] data )beamSend() 方法不是一个事件处理程序,但是它显然与 beamReceive() 相关联,所以我们在这儿还是要提一下。这种方法被用来给发送到另一个红外线 Palm 设备的数据包定向。在给数据定向时,您可以调用这个函数,但是目标设备必须在接收数据的 spotlet 中注册一个 beamReceive 处理器。
public static boolean beamSend( byte[] data )
unknownEvent 是一个常规的所有未知事件处理例程。
public void unknownEvent( int event, java.io.DataInput in )
Scribble 应用程序介绍
现在我们了解了事件处理的基础,我们即将进入更为高级一些的 J2ME 开发。在本章中,我们将开发 Scribble 应用程序。我们不会逐行描述代码,但是,我们将描绘重要的代码行和每个方法的目的。您可从参考资料上访问完整的代码清单。
Scribble 应用程序是一个独立的应用程序,示范使用 Sun 公司的 KJava API 开发 Palm 操作系统。Scribble 允许您在显示屏上徒手绘图,或添加想要的正规文本。
开始使用 Scribble
在 HelloWorld 应用程序中,我们需要导入 Scribble 应用程序要使用的类。下面是标识被 Scribble 使用的类的文本块:
import com.sun.kjava.Bitmap;
import com.sun.kjava.Button;
import com.sun.kjava.Dialog;
import com.sun.kjava.Graphics;
import com.sun.kjava.HelpDisplay;
import com.sun.kjava.Spotlet;
Scribble 类扩展了 J2SE 中使用的 Spotlet 类。它从定义最终的静态类变量开始。
public class Scribble extends Spotlet
类变量 g 担当了对单独的 Graphics 对象的引用,该对象在类中始终被使用:
static Graphics g = Graphics.getGraphics ();
定义方法和事件处理程序
此外,main() 定义了应用程序的主要入口。
public static void main(String[] args)
默认的构造程序,Scribble 初始化成员变量,清屏并画出初始框架。
public Scribble()
paint() 方法负责更新或刷新显示。它使用类变量 g —— 一个 Graphics 对象,类似于 Java 2 AWT 中使用的 Graphics 对象。
private void paint()
penDown() 方法执行事件处理程序来处理在屏幕上放置笔的事件。它通过 X 和 Y 坐标来定位。在 Scribble 中,程序测试 Clear 或 Exit 按钮是否被按下,如果按下的话,就处理相应的事件。
public void penDown(int x, int y)
keyDown() 方法处理那些在 Palm 设备的即兴书画框内随手写下的东西。传送到这个方法中的整型值 keyCode 就是输入的字符键值。在 Scribble 应用程序中,我们存储了成员变量 lastKey 中被按下的键,然后调用 paint() 方法刷新屏幕。
public void keyDown(int keyCode)
penMove() 方法处理在屏幕上拖动笔的事件。在 Scribble 中,它负责用笔绘画。
public void penMove(int x, int y)
使用的最后一个方法 clearDrawingArea(),在用户按下 Clear 按钮时由 penDown 事件处理程序调用。由于它仅在 Scribble 类的内部使用,所以 clearDrawingArea() 是一个私有方法。
private void clearDrawingArea()