无论学习什么新事物都讲究循序渐进学习JME也不例外在此我想先介绍一下使用JME开发Palm上的一个小的应用程序再深入探讨开发更加复杂的应用程序好那我么就开始吧
第一 获得 JME
你可以从Sun网站上下载到 JME CLDC文件第一个文件是 jme_cldc__srcwinsolzip它包括所有开发 CLDC应用程序时需要的类库除了包括类库以外它还包括源代码以及 Windows和 UNIX下的可执行代码用于 MIDP规定的 Java虚拟机引用实现看了前几篇文章的读者肯定都知道这里提到的Java虚拟机就是 K虚拟机 ( KVM )有了这个文件在开发过程中你就可以在个人电脑上调试程序而不用把这些程序下载到你的手持设备上
第二个文件是 jme_cldc_srcpalm_overlayzip它包括一个用于运行 Palm操作系统的设备的 KVM的实现以及把class文件通过一个 Java编译程序生成可执行 Palm文件的工具注意这是一个用于 Palm操作系统的 CLDC个别实现如果使用针对其它的设备的实现的话你的 Java应用程序也可以在其他设备上运行
为了开发用于 Palm OS设备的应用程序你必需在你的计算机上安装这两个Zip文件在本文中我假设你已经在 C盘中安装了 CLDC文件夹注意为了开发 CLDC应用程序你并不需要一个特定的 Java编译程序你可以使用 JSE带有的编译程序唯一的差别就是你必须在编译的时候更换成JME类库所在的路径你还要使用下载到的 CLDC中带有的特定软件来处理生成的 class文件
第二 运行文档附带的应用程序示例
你从Sun网站上下载的文件中包含了许多示例应用程序的源程序以及编译好的版本你可以在你的台式机上使用 KVM来运行这些示例应用程序运行这些应用程序可以使你对一个 CLDC应用程序有一个感性认识在运行这些程序之前你必要启动一个命令行界面然后输入下列命令
set cldc_classpath = c:;
set bin = %bin%;c:
cd
好现在你已经设置了环境变量并进入了保存示例应用程序的目录你就可以开始运行它们了比如说为了运行 UITest程序输入kvm classpath %cldc_classpath% UITest
你也可以看看 Pong这个游戏程序请在命令行输入下面的命令kvm classpath %cldc_classpath% Pong
是不是挺好玩你可以试一试运行每个示例应用程序稍后我们还要使用相同的方法来运行我们在台式机中开发的应用程序第三节 构建一个 Palm应用程序
好现在你对 JME的程序有一点感性认识了吧?现在让我们做一些实事吧我将介绍如何构建一个 运行于 Palm OS设备上的 Java应用程序首先虽然JME是Java技术但这并非意谓着你可以使用现有的 Java应用程序重新编译它们然后把它们运行于新的设备上在前面几章中我已经谈过JSE和JEE使用的Java虚拟机中的许多关键特性已经从JME虚拟机中删除了因为设备的资源有限
JME带的 Java虚拟机(KVM)缺乏浮点数支持;JME应用程序与 JSE JEE应用程序的另外一个重要的差别是缺乏优先型多任务虽然它不是 Java规范中所述的必要条件但是几乎你的 JSE JEE应用程序运行的所有机器都支持优先型多任务这意味着 CPU在多个 Java线程之间共享而不必在你的程序中添加任何特殊的代码而 JME使用的设备则往往没有这种功能为了确保多线程能够工作你必须调用 Threadyield()方法
使用 CLDC简表的另一个值得注意的方面是JME类库缺少许多 JSE类库中的类在构建应用程序时必须使用这有限制的类库当你下载到CLDC文件时你可以仔细考察你获得的文件弄清楚哪一个类包含在CLDC规范中你必须对付的最后一个问题是 CLDC类库内部缺少访问用户界面元素按钮菜单图形不使用 Palm的用户界面就不大可能为 Palm OS设备开发应用程序 Sun已经解决了这个问题使用一个单独的类库 comsunkjava来提供给你访问基层 Palm用户界面的权限下面这个示例程序就使用类库创建窗口按钮和对话框不过请注意kjava类库既不是 MIDP配置也不是 CLDC简表的官方部分它很有可能在未来的版本中改变或消失这就意味着你使用 kjava类库写的任何程序一旦发行新的JME版本你就不得不修改这个程序以适应新的JME版本但是现在它还是你开发使用Palm用户界面的应用程序的唯一选择
import lang*;
import comsunkjava*;
public class HelloWorld extends Spotlet
implements DialogOwner {
private Button quitButton;
private Button aboutButton;
private TextBox welcomeTextBox;
private final String welcomeString = Hello World ;
private final String aboutTitleString = About Hello World;
private final String aboutString = HelloWorld JME CLDC Application;
public HelloWorld() {
register(WANT_SYSTEM_KEYS);
welcomeTextBox = new TextBox(welcomeString );
aboutButton = new Button(About );
aboutButtonsetEnabled(true);
quitButton = new Button(Quit );
quitButtonsetEnabled(true);
paint();
}
public void dialogDismissed(String title) {
GraphicsclearScreen();
register(WANT_SYSTEM_KEYS);
paint();
}
public void paint() {
welcomeTextBoxpaint();
aboutButtonpaint();
quitButtonpaint();
}
public void penDown(int x int y) {
if (aboutButtonpressed(x y)) {
Dialog aboutDialog =
new Dialog(this aboutTitleString aboutString OK);
aboutDialogshowDialog();
}
if (quitButtonpressed(x y))
Systemexit();
}
public static void main(String args[]) {
new HelloWorld();
}
}
分析HelloWorld应用程序
上面的这个HelloWorld应用程序具有运行 Palm OS的设备上的 CLDC应用程序的基本特征当你仔细考察一下这段代码你会发现许多使用 kjava类库编译应用程序的特性首先这个程序扩展了 comsunkjavaspotlet类使用 kjava一个 spotlet就是任何可以得到焦点(focus)的类那就是说从系统中接收事件比如手写笔的点触在我们的例子中 当手写笔点击About和Quit按钮时HelloWorld应用程序需要响应因此它需要获得焦点你的应用程序可以包括任意多的从 spotlet中衍生的类虽然在任何时间它们中间只有一个能够取得焦点实际上应用程序通过调用 register方法使用焦点我们在 HelloWorld构造程序开始的部分和 dialogDismissed方法中都用了 registerHelloWorld类实现了 DialogOwner接口实现 DailogOwner接口的类是用于创建对话框的类我们的应用程序创建了一个对话框来响应手写笔点击 About按钮的事件为了实现DialogOwner接口你的类必须包含一个dialogDismissed成员方法为了实现 DialogOwner接口你的类必须包含一个 dialogDismissed成员方法这个方法在一个对话框被关闭的时间被调用
HelloWorld构造程序在屏幕上创建三个界面元素一个文本框和两个按钮你马上就会发现 kjava和 JSE AWT的一个重要的差别 kjava没有与 AWT自动布局机制等价的东西你必须自己编码确定每个界面元素在屏幕上的位置在我们的程序中我们把文本框放在()和()之间两个按钮放置在( )和()
每当用户在装置上轻点手写笔时都要调用HelloWorld的 penDown方法我们通过调用每个按钮的 pressed方法确定这次点击是否发生在按钮的边界以内如果按钮的pressed方法返回一个真值意味着手写笔点击事件发生在按钮边界之内这个按钮相对应的动作将发生比如说如果点击了 About按钮我们通过创建一个新的 Dialog对象创建 About对话框要是点击了 Quit按钮我们就终止这个程序
最后 当用户关闭对话框时要调用 HelloWorld的 dialogDismissed方法在我们的应用程序中这个方法做的事情就是通过调用 register方法恢复焦点并调用 paint方法来刷新屏幕
编译
编译一个 CLDC应用程序需要两步操作首先你必须通过标准的 JSE编译程序运行它们不过使用 CLDC类库代替标准的 JSE类库然后使用preverify程序把得到的class文件转化成 KVM可读的 Java应用程序
上面的示例程序如下面这样编译
javac g:none classpath %cldc_classpath% d %temp% HelloWorldjava
preverify classpath %cldc_classpath% s %temp% d
一旦编译好后就可以使用下面的命令来在你的台式机上运行这个程序
kvm classpath %cldc_classpath% HelloWorld
既然这个CLDC应用程序在计算机上可以运行那么你也可以试着把它转换成Palm可执行文件
在Palm上运行
为了把一个使用CLDC开发的class文件转换成在Palm OS设备上可实际运行的文件你需要使用jme_cldc_srcpalm_overlayzip中的许多程序首先你必须把你的 class文件转换成 Palm OS应用程序所有的 Palm OS应用程序都有扩展名 prc通过使用
palmdatabaseMakePalmApp类把 class文件转化成 prc文件使用下面这个命令行运行我们刚才写好的 HelloWorldclass文件
java palmdatabaseMakePalmApp bootclasspath %cldc_classpath% HelloWorld