搭建开发平台JBuilder
2005.07.20 来自:J2MEDev imtrash 共有评论()条 发表评论 收藏
JBuilder是目前进行Java程序开发中使用较为广泛的开发工具。作为大厂商,Borland当然会为不同的开发人群设计更为全面和专业的IDE环境。
1 JBuilder平台之J2ME开发简介
JBuilder是目前进行Java程序开发中使用较为广泛的开发工具。作为大厂商,Borland当然会为不同的开发人群设计更为全面和专业的IDE环境。作为J2ME应用开发,JBuilder是非常理想的开发环境,从第九版以后到现在的2005版,JBuilder都自带了MobileSet,它内附J2ME Wireless Toolkit(以下简称WTK),所以开发人员仅需配置好环境变量,便可直接进入JBuilder进行开发了。如果您还是在使用较早版本的JBuilder,由于其中没有附带J2ME开发的相关工具,您还需要到Sun的官方网站去下载并安装MobileSet。此外,您若要开发基于各个手机厂商机型的应用程序,最好同时到各个厂商的developer站点(如Nokia Forum、motocoder等)下载并在JBuilder中配置相关机型的SDK模拟器,这样可以使您的应用程序更好地适应相对应的真机机型。
2 开始搭建J2ME开发平台
现在我们就开始介绍如何在JBuilder中搭建最适合您的j2me开发环境。首先,我们要明确一个问题,在JBuilder中如果你想要开发基于手机厂商提供的开发包的应用程序时,必须要先确定您的JBuilder环境中已经存在有MobileSet这个插件。所以第九版之前的JBuilder一定要先下载这个插件。MobileSet与手机厂商提供的开发包之间不是并列的关系,厂商开发包是依附于其上的,因为MobileSet中附带的J2ME Wireless Toolkit定义了Configuration(配置)和Profile(简表)的内容,而厂商开发包中则提供了相关的APIs以及模拟器。在第九版至2005版中因为已经自带了MobileSet,所以在您正确安装了JBuilder9、JBuilderX或JBuilder2005之后便可直接进行j2me的程序开发了。需要注意的是JBuilder9至JBuilder2005中自带的WTK版本号分别为:1.04、2.0和2.1。
由于新的WTK2.2版包含支持JSR-184规范(3D Graphics API),以及提供了在视觉上更为舒服的模拟器,所以下面为大家演示如何让将WTK2.2嵌入到JBuilder环境中。
在安装WTK之前,是需要先安装JDK,请注意JDK是1.4.2之前的版本,则WTK2.2无法安装。之后就是安装WTK2.2:
http://java.sun.com/products/j2mewtoolkit/zh_download-2_2.html,通过这个地址您可以分别下载到基于Windows平台和Linux平台的两种WTK2.2的中文版,该版中提供的一些文档是中文的,所以非常便于初学者察看。下面将图解演示安装过程:
单击“下一步”,然后是“许可证协议”部分,点击“是”继续;
到此画面时,说明WTK2.2已经检测到了您的机器上已经安装的J2SDK并通过了测试,因为WTK的运行也是由J2SDK来提供支持的。由于我们就是要在JBuilder下进行j2me开发,所以此目录不必更改,此时可以点击“下一步”;此后一直点“下一步”便可安装完成了。
我们已经安装好了WTK2.2,现在就需要在JBuilder下进行配置了,以下将以JBuidler2005版作演示,其间如与以往版本不同时将另附图片进行介绍。
首先启动JBuilder,在菜单栏中选取“Project→Default Project Properties”:
点击之后,出现如下窗口我们将在JDK一栏进行设定。
点击JDK栏后的路径选择按钮,出现以下窗口:
此时由于还没有导入WTK2.2,所以要点击“New”按钮创建新的JDK,在后面的菜单中只要选择好路径会出现以下画面,此时点击“OK”就算设置好了。
JB9版和10版在以上设置中与2005版基本相同。此时您可以建立j2me工程了。
3 完成第一个MIDlet应用程序
在建立工程之前,我们首先应该进行一些默认设置的修改,选择“Projects/Default Project Properties”如下图所示:
在JDK栏中,如果您仅是把JBuilder作为j2me开发环境来使用的话,可以在此栏中直接选择WTK2.2,这样以后就不用频繁更改了。在JDK下面的三个设置分别为:输出路径、备份路径和工作目录,设置这些路径的原则是尽量简单以便于查找,路径中不能有空格以及中文字符,因为这些是导致编译不成功或者模拟器在出现之后闪现一下即消失的原因。设置好后点击“OK”,这样咱们就可以正式建立工程了。
在“File”菜单中选择“New”,此时会弹出下面的对话框:
其中,第一个图标表示建立一个新的工程;第二个“Project for Existing Code”代表建立一个已有代码的工程,当你得到别人的工程代码时,可以用通过建立这样的工程,对其进行编辑。我们选择“Project”会进入下面的画面:
在这里设置好工程名字后,底下可以不作改动,点击“Next”。
由于我们在默认设置时这些已经修改好,所以不用进行更改。可以点击“Next”进入下一对话框,那里可以设置语言编码以及JavaDoc等。如果没有特殊要求,此时可以直接点击“Finish”了。这样一个新工程就建立好了,但还不是一个真正的j2me MIDlet工程。
接下来我们选择“File/New”,在对话框左边栏选择“Micro”标签。在弹出的对话框中我们选择“MIDP MIDlet”,点击“OK”:
此处“Class name”是该工程的入口类名,下面是包名,当这些内容填写好后点击“Next”进入下一步:
在这一步画面当中,在第一行看到的是Displayable类的名称,如果您要开发的是基于高级UI的应用程序,在第三行的“Displayable type”一栏中,选择javax.microedition.lcdui.Form,如果您要是开发基于低级UI的应用程序,请选择javax.microedition.lcdui.Canvas,为了保证识别,请在设置类名的时候尽量能够体现出是基于哪种UI的。第二行是在基于高级UI时可以设定的Title名称,基于低级UI的应用程序,此处可不作修改。点击“Finish”,这个MIDlet工程就算建好了。
现在,已经看到JBuilder为我们建立了两个类,并且自动生成了一些代码,即使你不添加任何新的代码,这些代码也可以保证在模拟器中正常运行,只不过将看不到什么明显的效果。假设刚才建立的是一个低级UI类,我们可以在这个类中添加一些代码,让我们看到一些显示效果。代码如下,红色为自行添加的代码:
package com.imtrash.hello;
import javax.microedition.lcdui.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class myCanvas extends Canvas implements CommandListener {
public myCanvas() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
// Set up this Displayable to listen to command events
setCommandListener(this);
// add the Exit command
addCommand(new Command("Exit", Command.EXIT, 1));
}
public void commandAction(Command command, Displayable displayable) {
/** @todo Add command handling code */
if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
myMIDlet.quitApp();
}
}
protected void paint(Graphics g) {
/** @todo Add paint codes */
//把背景底色设为白色
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(),getHeight());
//写出“Hello World!”
g.setColor(0xFF0000);
g.drawString("Hello World!",20,20,g.TOP|g.LEFT);
}
}
此时右键点击左边工程栏的入口类(MIDlet类)可以看到下面的画面:
点击“Micro Run using “myMIDlet””,如果按照前面的步骤配置正确的话,就会出现模拟器,“启动”后,就会显示出“Hello World!”字样了。
一个完整的MIDlet程序就完成了。另外需要注意的是,如果要为工程添加资源(图片、音乐文件等)文件,那么在模拟器中运行该工程之前,必须首先将该工程打包以后才可以。这一部分将在下一节中进行介绍。
上面已经完成了一个简单的MIDlet应用程序,那么JBuilder都为我们自动生成了哪些代码呢?下面将以初始创建的myMIDlet和myCanvas两个类进行介绍:
myMIDlet类是整个MIDlet应用程序的入口类,负责整个MIDlet应用程序的生命周期。
package com.imtrash.hello;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class myMIDlet extends MIDlet {
static myMIDlet instance; //生成一个静态的myMIDlet的实例
myCanvas displayable = new myCanvas();//创建一个myCanvas实例
public myMIDlet() {
instance = this;
}
//启动(该方法必须存在)
public void startApp() {
//取得当前的屏幕设备并设置在其上显示画布
Display.getDisplay(this).setCurrent(displayable);
}
//暂停(该方法必须存在)
public void pauseApp() {
}
//销毁(该方法必须存在)
public void destroyApp(boolean unconditional) {
}
//退出,此方法为JBuilder自动为我们生成,但不是必须的,你可以自定义其名称和内容以完成退出功能
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
这个入口类很简单,通常情况下自己想实现的内容不必写在这个类中,这样可以使结构能够更加清晰。
package com.imtrash.hello;
import javax.microedition.lcdui.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class myCanvas extends Canvas implements CommandListener {
public myCanvas() {
try {
//JBuilder为类自动生成的进行初始化的方法
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//jbInit()方法体,这里可以添加我们需要进行初始化的内容
private void jbInit() throws Exception {
// Set up this Displayable to listen to command events
setCommandListener(this);
// add the Exit command
addCommand(new Command("Exit", Command.EXIT, 1));
}
//由于该类实现了CommandListener接口,所以需要覆写commandAction()方法
public void commandAction(Command command, Displayable displayable) {
/** @todo Add command handling code */
if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
myMIDlet.quitApp();
}
}
//该类为Canvas的子类,所以要实现paint()方法
protected void paint(Graphics g) {
/** @todo Add paint codes */
}
}
由此可以看到JBuilder是非常人性化的,它自动为我们生成了一些必要的代码。我们甚至可以不添加任何代码,就可以将其运行在模拟器当中。那么,如果我们不熟悉j2me各包和类中都提供了哪些方法和接口该怎么办呢?JBuilder提供了强大的Wizard功能。如下两幅图所示,分别为JB9和JB2005的override methods和 implement interface的选项,我们可以在其中根据不同的类和需要进行调用,这样非常便于初学者规范地编写代码还避免看不懂错误提示所带来的困扰。
JBuilder 9
JBuilder 2005
4 常用快捷键
除了以上技巧,我们在编写代码时也可以使用一些常用的快捷键以帮助我们提高效率。这里将对各快捷键进行一一说明,大家在实践中将会体验到其方便之处:
编辑时:
l Ctrl + Z:Undo
l Ctrl + J:调用模板(很实用,如下图)
l Alt+Shift+K:格式化(写代码要有良好习惯,若自己写的很乱就按一下吧),或者按下Tab键可以对所选择的文本进行格式化
l Ctrl + Shift + num:设置Bookmark。
l Ctrl + num:到达指定Bookmark。
l Shift + Tab:以块前进
l Ctrl+Enter 快速定位到某个变量(函数)的定义处,也可以按住Ctrl用鼠标点
l Ctrl+Shift+Enter列出定义及所有使用过该变量(函数)的位置
调试时:
l F9:运行工程
l Shift + F9:调试工程
JBuilder还为我们提供了许多快捷键和便于编辑、查找代码的功能,在编写代码的过程中,您会逐渐体会到它的方便快捷。另外,如有问题可以随时按下F1键去帮助系统中查找信息。以上就是我们使用JBuilder进行j2me开发过程中的一些问题,下面我们将对工程进行收尾工作并完善你的工程。
5 混淆与打包
下面对这个工程进行打包操作。选择“File/New”,点击Archive标签,如下图所示:
另外第9版以及第10版的“Archive”并没有“File/New”菜单中,而是在Wizards菜单中,如下图所示:
在“Wizard”菜单中的“Archive Builder”就是我们要的选项,进入后的设置与下面近似。双击“MIDlet”进入打包设置的第一步,设定包名等信息后点击“Next”出现第二步:
在这里可以添加资源文件,不过对于添加资源文件,我们都是放在src目录里,然后刷新工程就会自动把资源添加进工程,打包时会把这些文件加进包里,并不需要在此处进行添加。另外,对于某些后缀名的文件,如WAV文件,打包时不会自动加入,需要修改设置查看Porject栏中的***.jar的属性,会列出各个类型的文件及其是否会拷贝进包里,找到WAV,设置成copy即可。
接下来一直点击“Next”直到第四步:
注意,如果想以后将应用程序移到移动设备中运行,那么这一步的设置非常重要。首先要了解,将要移植到的设备的Configuration和Profile信息,只有这一步中的设置和手机支持的配置和简表信息一致,应用程序才能够在该设备上正常运行。
第五步为设置MIDlet包的可选属性。这里依照顺序分别可以对图标、描述、相关信息网址、RMS大小、安装通知、删除通知以及删除确认。在打包后,这些信息将分别存入到JAD描述文件和JAR包中的清单文件中,像Description、Info-URL、Data-Size等信息将会保存到JAD文件中,这样在通过OTA方式进行下载应用程序时可以起到预览作用以决定是否要下载整个应用程序。
一路“Next”来到了第十步,这里我们可以选择混淆器为我们的应用程序进行扰码。JBuilder为我们提供的混淆器是RetroGuard for J2ME,当然我们也可以自己选择其他的混淆器如ProGuard,只要指定其路径即可。
最后一步,我们可以设置数字签名等信息(在JB9中无此项),如果没有要求可直接点击“Finish”,这样我们的MIDlet包就建立好了,但是并没有真正打包。此时把目光转向左边Project栏:
此时点击“Rebuild”包就打好了,如下图:
然后点击“Micro Run using “helloMIDlet””就可以在模拟器中运行程序了。
好了,通过打包我们将资源显示到的模拟器的屏幕上了。如果打包了,那么在以后还能够对包中的资源进行删除和添加吗?回答是肯定的,下面将演示如何进行添加或删除资源。这里我们2005版本进行演示:
右键点击套件“MIDlet Suite”,点击最后的选项“Properties”后,会弹出一个对话框,里面可以对我们刚才进行打包过程中的设置进行更改。
这样就可以对资源进行更新了。JBuilder 9和JBuilder10可以在“Wizard/Archive Builder”菜单中进行设置。
到此,已经对在JBuilder环境中进行J2ME开发进行了详细的介绍,相信通过以上的演示,能够使您对此有一个大概的了解并能够独立进行开发了。
6 可能会遇到的问题
最后这一节,将列出一些常见的异常和错误提示,以便于大家查对。
6.1 打包大小异常
如果发现打出来的包大小有异常,很有可能是把Thumbs.db打进来了,此文件用于以缩略图的形式查看图片,而且是隐藏的。搜索目录删除它就可以了。
6.2 运行时出现堆栈溢出
如果不是程序自身的问题,请尝试去掉一些System.out.println()。
6.3 光标问题
JBuilder 9由于一些小Bug,使我们在编写代码的十分不便。由于在编写代码时,关键字为粗体,使得光标定位十分困难,所以我们要在“Tools”菜单中选取“Editor Options”。