收藏 分享(赏)

J2ME学习之环境搭建.doc

上传人:dzzj200808 文档编号:2728976 上传时间:2018-09-26 格式:DOC 页数:87 大小:1.16MB
下载 相关 举报
J2ME学习之环境搭建.doc_第1页
第1页 / 共87页
J2ME学习之环境搭建.doc_第2页
第2页 / 共87页
J2ME学习之环境搭建.doc_第3页
第3页 / 共87页
J2ME学习之环境搭建.doc_第4页
第4页 / 共87页
J2ME学习之环境搭建.doc_第5页
第5页 / 共87页
点击查看更多>>
资源描述

1、J2ME 学习之环境搭建来源:CSDN 作者:新书城收集整理 发布时间:2006-7-12 人气:217虽然公司使用 JBuilder,但是我还是觉得 Eclispe 是大势所趋,所以我选择了 Eclipse 作为开发环境。使用软件:Eclipse3.2 ,EclipseMe1.5.5,WTK 2.2,下载地址我就不再抄了。我们应该相信 Google 和 Baidu,呵呵。关于 Eclipse 开发 J2ME 环境的配置,网上已经有很多文章了,但大都是关于旧版本的,EclipseMe1.5.5 中稍有变化,所以我在这里主要说一下其中的变化以及浪费我一中午的配置问题。依次安装好上述三个软件,没有

2、必须的顺序。EclipseMe 的安装可以采用 link 方式,干净,但是事实证明,这样安装后再删除,也不是一点尾巴都不留下的,这个我在最后再说。在这里我们使用 link 方式安装插件。EclipseMe1.5.5 的配置:插件安装完后,启动 eclipse,点击 window 菜单下的 Preference,如果有 J2ME,就说明安装成功。然后就是配制 WTK 的安装目录,然后,在 Device Manage 里面,依次按照 Import-Browse-WTK 安装目录,选择 WTK 安装目录后,点 refresh,这样就基本上搞定配制了。最后别忘记点 Apply。如果你想使用 Anten

3、na(打包发布工具,可以执行 ant 脚本),和混淆器,可以在这里配制方法很直观,就不赘述了。配制好后,新建一个 J2ME 项目 File-new-other-J2ME-J2me Modlet Suite。起个名称,然后一切默认就好。我的项目名叫做 MyJavaMETest新项目上右击,new-other-J2ME-J2me Modlet。起个类名,然后一切默认。我的类名叫做 MyJavaMETest(如果你想 copy 我下面的例子程序,就按照这个名称就好)ps,因为是入门,所以一切默认,呵呵。然后编写程序,代码如下:import javax.microedition.lcdui.Displ

4、ay;import javax.microedition.lcdui.TextBox;import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;public class MyJavaMETest extends MIDlet private Display display;private TextBox textbox;public MyJavaMETest() display = Display.getDisplay(this);/ TODO Auto

5、-generated constructor stubtextbox = new TextBox(“, “, 500, 0);display.setCurrent(textbox);textbox.setTitle(“J2ME 程序“);textbox.setString(“你好“);protected void destroyApp(boolean arg0) throws MIDletStateChangeException / TODO Auto-generated method stubprotected void pauseApp() / TODO Auto-generated me

6、thod stubprotected void startApp() throws MIDletStateChangeException / TODO Auto-generated method stub然后 run-WireLess Toolkit Emulator-new-配置,这里,主要选择自己的项目,然后,选择 Moelet,Search 后选择 MyJavaMETest。然后点 run 运行就可以了。这个程序能够运行,说明环境已经搭建好了,以后就可以“肆意妄为”了,哈哈。最后说一下 Eclipse 和插件的问题,其实这个问题以前我也遇到过。我首先是安装了 EclipseMe1.5.5

7、,可是因为网上的文章说的都是 老版本的配置,所以配置失败了(没想到在Device Manage 里面,依次按照 Import-Browse-WTK 安装目录,选择 WTK 安装目录后,点 refresh),然后就按照文章的要求,下载了旧的版本,可是在安装后,每次到配置运行参数的时候,Eclipse 就会告诉我出错,原因是在安装了新版本的 EclipseMe 后,它已经在插件安装目录外的地方外保存了设置,导致旧版本的 EclipseMe 无法正常运行。这时就必须使用新版本了。以前使用 CVS 插件的时候,也遇到过这种问题。后来发现,eclipse 是在每个项目的 metadata 文件夹下的 p

8、lugin 目录中按照插件名称保存的插件参数,呵呵很聪明的做法,可以让不同的项目有不同的配制。J2me 手机程序开发起步J2me 手机程序开发起步开发 j2me 手机程序的工具初学者选用 Sun Java Wireless Toolkit(WTK)是个不错的选择,下面用一个简单的 J2ME 手机程序,介绍 WTK 开发 J2ME 手机程序的过程。1. 工具J2SE 5.0下载地址Sun Java Wireless Toolkit 2.2 (WTK)下载地址:http:/ j2me 源程序,如果不想用它,其它的文本编辑器都行,如 windows 中的写字板。.2. 开发环境配置先安装 J2SE,

9、我的目录是:c:jdk1.5,然后安装 Sun Java Wireless Toolkit 2.2,我的目录:c:WTK2.2。配置 java 环境就不多说了。3.WTK 的目录结构安装完成后我们会在安装目录下看到一些文件和文件夹,主要的 apps: 自带的 demo 程序,也是存放我们的项目文件的地方 ,每一个项目都会自动建立一子目录来管理与项目相关的文件。现有的项目也可以直接复制到该目录下运行和调试。 bin: J2ME 开发工具执行文件 docs: 存放一些帮助文档. lib: J2ME 程序库,Jar 包与控制文件 wtklib: WTK 主程序与模拟器外观 index.html: 是

10、一个关于 j2me 的参考手册.4.启动界面 我们在开始所有程序中可以找到刚刚安装的(WTK),如图KToolbar 是 WTK 最常使用的工具,它可以用来建立工程,修改工程,以及启动模拟器来调试执行我们所编写的程序。如图:图 15.第一个 J2ME 程序我们运行 Wireless Toolkit 开发工具.进入 Wireless Toolket 的界面,如上图所示。首先,我们点”File New Project”或者直接点”New Project”按钮,建立一个新的项目,如图所示:图 2在里面填入项目名和 MIDlet 的主类名,点”Create Project”按钮,出现了下图所示的界面:

11、注意了,这里项目名可以自己随意起,但是类名要和我们一会儿写代码时的类名保持一致。图(3)该界面用于配置 MIDP 应用程序的一些属性值,取默认值,点”OK”。这样进入下图:图 4这里提示你应该将 java 源文件放入:c:WTK22appsHellosrc 下面。你进入”WTK”安装目录中的 apps 文件夹,可以看到多了一个 Hello 文件夹,它就是你所建立的项目文件目录。WTK 产生项目后,不同类型的资源有着相对固定的存放位置。Java 源文件被放在 apps 目录下Hellosrc 下,相关程序资源文件(图片,音频)放在Hellores 下,应用程序库文件放在Hellolib 下,这在

12、 WTK 中是必须注意的,即便是相对路径,也必须是在该目录下建立。项目创建成功后,我们来创建一个 MIDlet 文件,MIDlet 是 J2ME 项目文件的入口文件,也是必须的。在Hellosrc 目录下创建 Hello.java,采用默认包,注意,此时创建的 java 程序必须是与我们在创建项目时键入的 MIDlet 类名一致。一个 MIDlet 在生命周期中有三个状态 Active(激活),Paused(挂起)和Destroyed(销毁)。这些状态直接对应三个方法 startApp(),pauseApp(),destroyApp()。一个典型的 MIDlet,大多数处于 Active 或

13、Paused 状态,当MIDlet 关闭时进入 Destroyed 状态,直到完全从内存中移出。我们自己的MIDlet 程序要覆盖(override)相关的生命周期方法。例如,当一个游戏 MIDlet启动时,你可能要创建对象或装载数据;当 MIDlet 暂停时,你可能应当关闭网络连接并暂停音乐;最后 MIDlet 销毁时要释放分配的资源,同时保存相关的游戏数据。下面是我们简单的 MIDlet:import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class Hello extends MIDlet

14、 implements CommandListener /要继承 MIDlet 类private SCanvas canvas;/绘图的画布,绘图都在这个上进行。private Display display;/屏幕管理器public void startApp() /MIDlet 类中定义的方法之一,启动 MIDletif (canvas = null) display=Display.getDisplay(this);/得到这个 MIDlet 的屏幕管理器canvas = new SCanvas();Command exitCommand = new Command(“Exit“, Com

15、mand.EXIT, 0);canvas.addCommand(exitCommand);canvas.setCommandListener(this);display.setCurrent(canvas);/将当前 MIDlet 的屏幕设为 canvas/ Start up the canvascanvas.start();public void pauseApp() /MIDlet 类中定义的方法之一,暂停 MIDlet,这里什么都不做。public void destroyApp(boolean unconditional) /MIDlet 类中定义的方法之一,销毁 MIDlet。这里什

16、么都不做。public void commandAction(Command c, Displayable s) if (c.getCommandType() = Command.EXIT) destroyApp(true);notifyDestroyed();class SCanvas extends Canvas public SCanvas() super();void start() repaint();public void paint(Graphics g) / 清屏g.setColor(0, 0, 0); / blackg.fillRect(0, 0, getWidth(), g

17、etHeight();g.setColor(255, 255, 255); / whiteint y = 0;String screenSize = “屏幕大小: “ + Integer.toString(getWidth() + “ x “ +Integer.toString(getHeight();g.drawString(screenSize, 0, y, Graphics.TOP | Graphics.LEFT);/ 总内存和自由内存数Runtime runtime = Runtime.getRuntime();y += Font.getDefaultFont().getHeight(

18、);String totalMem = “总的内存: “ + Long.toString(runtime.totalMemory() / 1024) + “KB“;g.drawString(totalMem, 0, y, Graphics.TOP | Graphics.LEFT);y += Font.getDefaultFont().getHeight();String freeMem = “可用内存数: “ + Long.toString(runtime.freeMemory() / 1024) + “KB“;g.drawString(freeMem, 0, y, Graphics.TOP

19、| Graphics.LEFT);将上面的程序以”Hello.java”命令保存在我们刚才建的项目中的 src 目录底下,这时我们点图(4)所示界面中的”Build”按钮,”Wireless Toolkit”将自动为我们编译源代码,编译成功后,生成的相应的文件都会放到项目文件夹Hello 下相应的目录中,我们就可以点击图(4)所示的”Run”按钮启动程序,再点击手机上 launch 按钮运行程序了,如图(5)所示:我的 J2ME 编程练习(4)StringItemwhoamiindeed /* stringItemlet.java* Created on 2005 年 4 月 14 日, 下午

20、 4:26*/import javax.microedition.midlet.*;import javax.microedition.lcdui.*;/* author Administrator* version*/public class stringItemlet extends MIDlet implements CommandListener,ItemCommandListenerprivate Form aform;private Command okCommand;private Command exitCommand;private Command hllinkCommand

21、;private Command bCommand;private Display aDisplay;private StringItem hlstringItem;private StringItem bstringItem;private Alert hlAlert;private Alert bAlert;public stringItemlet()okCommand=new Command(“OK“,Command.OK,1);exitCommand=new Command(“EXIT“,Command.EXIT,1);hllinkCommand=new Command(“LINK“,

22、Command.ITEM,2);bCommand=new Command(“BUTTON“,Command.ITEM,2);aform=new Form(“StringItemTest“);/if click hyperlink “here“,display anAlerthlstringItem=new StringItem(null,“here“,Item.HYPERLINK);hlstringItem.setItemCommandListener(this);hlstringItem.setDefaultCommand(hllinkCommand);bstringItem=new Str

23、ingItem(null,“Available?“,Item.BUTTON);bstringItem.setItemCommandListener(this);bstringItem.setDefaultCommand(bCommand);hlAlert=new Alert(“Item.HYPERLINK“,“You Can Call Me 800-8101234“,null,AlertType.INFO);bAlert=new Alert(“Item.Button“,“The Button is Available!“,null,AlertType.INFO);aform.append(“A

24、ny question ,please click “);aform.append(hlstringItem);aform.append(bstringItem);aform.addCommand(okCommand);aform.addCommand(exitCommand);aform.setCommandListener(this);public void startApp() aDisplay=Display.getDisplay(this);aDisplay.setCurrent(aform);public void pauseApp() public void destroyApp

25、(boolean unconditional) public void commandAction(Command c ,Displayable d)if(c=exitCommand)destroyApp(false);notifyDestroyed();elsepublic void commandAction(Command c,Item i)if(c=hllinkCommand)aDisplay.setCurrent(hlAlert,aform);else if(c=bCommand)aDisplay.setCurrent(bAlert,aform);这个程序如果说有什么比较新的东西的话

26、,那就在于运用了 StringItem 的外观模式:HYPERLINK 和BUTTON。由此也使用了 ItemCommandListener 接口,实现了 commandAction(Command c ,Item i)方法。这个方法的方法体的写法和 commandAction(Command c , Displayable d)很类似,这一点可以从程序中看出来。需要说明的是,commandAction(Command c , Item i)方法也可以使用 Item 变量 i 进行选择,例如:if (i=oneItem)if (c=oneCommand)/ the programelse if

27、 (i=otherItem)if (c=http:/www.java- /the program此外,该程序在编写时,忘记写 aform.setCommandListener(this);语句了,致使 EXIT 按钮按下后无法退出,这件事提醒我,编程序时要细心!一个简单的 CustomItem 使用案例import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class SimpleItemMIDlet extends MIDletimplements CommandListener public v

28、oid startApp() Form form = new Form(“SimpleItemMIDlet“);form.append(new SimpleItem(“SimpleItem“);Command c = new Command(“Exit“, Command.EXIT, 0);form.addCommand(c);form.setCommandListener(this);Display.getDisplay(this).setCurrent(form);public void pauseApp() public void destroyApp(boolean unconditi

29、onal) public void commandAction(Command c, Displayable s) if (c.getCommandType() = Command.EXIT)notifyDestroyed();class SimpleItem extends CustomItem public SimpleItem(String title) super(title); / CustomItem abstract methods.public int getMinContentWidth() return 100; public int getMinContentHeight

30、() return 60; public int getPrefContentWidth(int width) return getMinContentWidth();public int getPrefContentHeight(int height) return getMinContentHeight();public void paint(Graphics g, int w, int h) g.drawRect(0, 0, w - 1, h - 1);g.setColor(0x000000ff);int offset = 0;for (int y = 4; y 0) byte serv

31、letData = new bytelength;iStrm.read(servletData);/显示返回信息mainForm.append(“验证通过: n“+ new String(servletData); elsemainForm.append(“不能访问数据!“); catch (Exception e) mainForm.append(“网络出错“);System.out.println(e.toString(); finally /关闭连接对象if (iStrm != null)iStrm.close();if (http != null)http.close();public

32、 void commandAction(Command c, Displayable s) if (c = exitCommand) destroyApp(false);notifyDestroyed();使用缓存将屏幕内容存储为 Image本文介绍如何将手机屏幕的内容存储为 Image 对象,这里认为手机屏幕上显示的是一个 Canvas。完成这一个功能的思想就是使用缓冲机制。我们不能直接获得 Canvas 上的像素,因此不能直接从 Canvas 上的内容获得 Image 对象。转换一下思路,如果把要绘制的 Canvas 上的内容首先绘制到一个 Image 上,而这个 Image 并不显示到屏

33、幕上,只是在绘画完成后一次性的显示到屏幕上。有经验的朋友一定联想到了双缓冲机制,不过这里并不是要使用双缓冲解决闪屏的问题,而是要得到当前 Canvas 的内容。 下面我们编写一个简单的 Canvas 类来测试一下这个想法,SimpleCanvas 是 Canvas 的子类,为了保存 Canvas 的内容,我们创建一个 Image,大小与 Canvas 的尺寸相当。import javax.microedition.lcdui.*;import javax.microedition.io.*;class SimpleCanvas extends Canvasint w;int h;private

34、 Image offImage = null;private boolean buffered = true;public SimpleCanvas(boolean _buffered)buffered = _buffered;w = getWidth();h = getHeight();if(buffered)offImage = Image.createImage(w,h);protected void paint(Graphics g) int color = g.getColor();g.setColor(0xFFFFFF);g.fillRect(0,0,w,h);g.setColor

35、(color);Graphics save = g;if(offImage != null)g = offImage.getGraphics();/draw the offimageg.setColor(128,128,0);g.fillRoundRect(w-100)/2,(h-60)/2,100,60,5,3);/draw the offimage to the canvassave.drawImage(offImage,0,0,Graphics.TOP|Graphics.LEFT);public Image printMe()return offImage;可以看到 paint()方法,

36、并不是直接对 Canvas 操作,而是先把要画的内容绘制到一个 Image 上,然后再绘制到 Canvas 上。这样到你想抓取屏幕内容的时候就可以调用 printMe()方法了,返回 offImage。编写一个 MIDlet 测试一下这个效果。 import javax.microedition.midlet.*;import javax.microedition.lcdui.*;/* author mingjava* version*/public class PrintScreen extends MIDlet implements CommandListenerprivate Displ

37、ay display = null;private SimpleCanvas canvas = new SimpleCanvas(true);private Command printCommand = new Command(“Print“,Command.OK,1);public void startApp()if(display = null)display = Display.getDisplay(this);canvas.addCommand(printCommand);canvas.setCommandListener(this);display.setCurrent(canvas

38、);public void pauseApp() public void destroyApp(boolean unconditional) public void commandAction(Command command, Displayable displayable) if(command = printCommand)Form form = new Form(“screen“);form.append(canvas.printMe();display.setCurrent(form);运行 PrintScreen,选择 Print,即可把当前的屏幕显示到一个 Form 中。如下图所示

39、:移动的格子import javax.microedition.midlet.MIDlet;import javax.microedition.lcdui.*;/made by sword2008程序之巢/游戏第一课 画格子public class Gofirst1 extends MIDlet public Gofirst1() public void startApp()Display.getDisplay(this).setCurrent(new First1();public void pauseApp()public void destroyApp(boolean unkown) c

40、lass First1 extends Canvas private int color;private int forOneTime=0;private Graphics g;private int startX=getWidth()/4-40;/起点坐标和终点坐标非常重要,格子剩下的是分成等分private int startY=getHeight()/4-40;private int nowX=startX,nowY=startY;public void paint(Graphics g)if(forOneTime=0)color=g.getColor();g.setColor(255,

41、255,255);g.fillRect(0,0,getWidth(),getHeight();g.setColor(255,0,0);g.drawRect(startX,startY,200,200);drawline(g);else if(forOneTime=1)/fireg.setColor(0,255,0);g.fillRect(nowX,nowY,20,20);long memory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();System.gc();System.out.prin

42、tln(“当前占用内存:“+memory);else if(forOneTime=2)/downnowY+=20;/竖坐标加 20,以下依此类推ifmaxmingolong();g.fillRect(nowX,nowY,20,20);else if(forOneTime=3)/upnowY-=20;ifmaxmingolong();g.fillRect(nowX,nowY,20,20);else if(forOneTime=4)/leftnowX-=20;ifmaxmingolong();g.fillRect(nowX,nowY,20,20);else if(forOneTime=5)/rig

43、htnowX+=20;ifmaxmingolong();g.fillRect(nowX,nowY,20,20);private void drawline(Graphics g)/画格子 for(int i=1;istartX+180)nowX-=20;if(nowYstartY+180)nowY-=20;/keypublic void keyPressed(int Keycode)/k 小写int action=this.getGameAction(Keycode);switch(action)case Canvas.FIRE:forOneTime=1;repaint();break;cas

44、e Canvas.DOWN:forOneTime=2;repaint();break; case Canvas.UP: forOneTime=3;repaint();break;case Canvas.LEFT:forOneTime=4;repaint();break;case Canvas.RIGHT:forOneTime=5;repaint();break;default:break;J2ME 贪吃蛇源代码/文件名:SnakeMIDlet .javapackage snake;import javax.microedition.midlet.*;import javax.microedit

45、ion.lcdui.*;public class SnakeMIDlet extends MIDlet SnakeCanvas displayable = new SnakeCanvas();public SnakeMIDlet() Display.getDisplay(this).setCurrent(displayable);public void startApp() public void pauseApp() public void destroyApp(boolean unconditional) /文件名:SnakeCanvas.javapackage snake;import

46、java.util.*;import javax.microedition.lcdui.*;/* 贪吃蛇游戏*/public class SnakeCanvas extends Canvas implements Runnable/*存储贪吃蛇节点坐标,其中第二维下标为 0 的代表 x 坐标,第二维下标是 1 的代表 y 坐标*/int snake = new int2002;/*已经使用的节点数量*/int snakeNum;/*贪吃蛇运动方向,0 代表向上,1 代表向下,2 代表向左,3 代表向右 */int direction;/*移动方向 */*向上*/private final in

47、t DIRECTION_UP = 0;/*向下*/private final int DIRECTION_DOWN = 1;/*向左*/private final int DIRECTION_LEFT = 2;/*向右*/private final int DIRECTION_RIGHT = 3;/*游戏区域宽度*/int width;/*游戏区域高度*/int height;/*蛇身单元宽度*/private final byte SNAKEWIDTH = 4;/*是否处于暂停状态,true 代表暂停*/boolean isPaused = false;/*是否处于运行状态,true 代表运

48、行*/boolean isRun = true;/*时间间隔*/private final int SLEEP_TIME = 300;/*食物的 X 坐标 */int foodX;/*食物的 Y 坐标 */int foodY;/*食物的闪烁控制*/boolean b = true;/*Random 对象*/Random random = new Random();public SnakeCanvas() /初始化init();width = this.getWidth();height = this.getHeight();/启动线程new Thread(this).start();/* 初始化开始数据*/private void init()/初始化节点数量snakeNum = 7;/初始化节点数据for(int i = 0;i 0;i-)snakei0 = snakei - 10;snakei1 = snakei - 11;/第一个单元格移动switch(dire

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报