1) package fancy.test;
这行代码声明当前类所在的包。这是有必要的。而且这个包名必须和src文件夹中的目录结构对应。
2)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
这两行代码导入必要的java包,这两个包的作用在后面会提及,这里就不多说了。
3)
public class helloworld extends midlet implements commandlistener
j2me程序一般应该继承midlet,实现commandlistener。就如applet必须继承applet,可能实现runnable接口一样。
4)
private display display;
private form props;
定义两个私有对象,display代表屏幕,显示区域。form是容器的一种。在j2me程序中,不但有容器的概念,还有画布(canvas)的概念。这个程序在form容器中显示文本。
5)
private command exitcommand = new command("exit", command.exit, 1);
声明一个command对象。j2me的事件处理机制和j2se的事件处理机制不太一样。在j2me程序中,必须预先定义一些command对象,注册到程序中。当设备发生了某个事件,会产生相应的command对象,并把它传递给一个事件处理函数----commandaction(),由它对所产生的事件做统筹处理。
6)
public helloworld()
{
display = display.getdisplay(this);
}
这个是构造函数,函数内部,调用display对象的静态方法---getdisplay(),获取
屏幕对象,实例化display变量。这个调用是必要的。你可以在构造函数中做这个工作,也可以在startapp()方法中做这个工作。推荐在构造函数中完成。
7)midlet程序的运行流程
构造函数---->startapp()------>侦听事件,接受命令
------->commandaction()方
法----
--->调用别的方法----------->如果是exit命令
--------->pauseapp()--------->destroya
pp()方法。实际上midlet程序的运行流程和applet程序的运行流程差不多。
8)
public void startapp()
{
props = new form("hello world");
props.append("hello world!\n");
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
这是startapp()方法。这个方法是父类的抽象方法,在子类中必须予以覆盖。首先实例化form对象----------props,form的构造函数的参数(hello world)就是屏幕的标题。
form对象是一容器,在里面可以包含别的东西,props.append("…..");的作用就是在这个容器中存放一个字符串。这个字符串会在屏幕中显示出来。
接下来的三行代码分别做这样的工作:
将exit命令注册到form对象(props)中,这样form对象(props)可以对该命令作出响应。
设置form对象(props)的命令监听者。
将form对象设置为屏幕显示的对象。
你可以试着注释掉这三行代码,再编译运行这个程序,看看会发生什么情况。
9)
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
这个方法是事件处理的中枢,它接受各种命令,并对其进行分析,再分别调用合适
的处理方法。在这个例子中,当接收到exit命令以后,马上销毁程序,退出。
10)destroyapp()方法的作用是退出程序并销毁程序对象。pauseapp()方法的作用是暂停程序,并销毁容器对象或者是画布对象。手机屏幕将会是一片空白。
javax.microedition.lcdui:用户界面包,主要用于构造程序的用户界面。
command、form都是这个包的类。
javax.microedition.rms:这个包实现了对手机数据的存取功能。
javax.microedition.midlet:这个包是midlet程序的声明周期包,主要定义了
midlet类,midlet类是一个抽象类,里面声明了startapp()、destroyapp()、pauseapp()等抽象方法。
javax.microedition.io:网络io包。有httpconnection接口和connection接口、datagram接口。
java.io.*
java.lang.*
java.util.*
上面这三个包属于j2me核心包,j2me中的核心包和j2se中的同名核心包有些差别,主要是功能大大简化了,许多类、方法都没有了,只能实现一些最基本的功能。
j2me开发中有中文问题吗?可能有,但是我目前没有遇到。因为我没有手机,只能在模拟器上运行j2me程序,真实的情况是什么样子我也不知道。在水木上有人说已经出现了中文问题,在模拟器上好好的,到了真正的手机上却是一团乱码。我现在也没有办法,只有在遇到的时候再补上这一节。我写的测试程序如下所示,这个程序是在helloworld.java的基础上改进而来的
。
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class poem extends midlet implements commandlistener
{
private display display;
private form props;
private command exitcommand = new command("exit", command.exit, 1);
public poem()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("影落寒潭的签名档");
props.append("小楼一夜听春雨\n");
props.append("深巷明朝卖杏花\n\r");
props.append("虹虹的签名档\n");
props.append("鸳鸯独宿何曾惯\n");
props.append("化作西楼一缕云\n");
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
使用普通的编辑器编辑好上述文件以后,保存为poem.java,保存路径为
src\fancy\test。然后在ktoolbar中编译,一切无误之后,单击setting按钮,出现一个配置窗口,选择midlets面板,单击add按钮,依次输入poem、fancy.png、fancy.test.poem三项。单击ok按钮,再单击ok按
钮,关闭配置窗口,回到ktoolbar的主界面,再次编译。一切无误之后,单击run按钮运行程序。
注意:每新编写一个程序,都要按照这个步骤进行配置,再编译运行,我以后就不再重复描述这个步骤了。
请看下面的代码(prop.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class prop extends midlet implements commandlistener
{
private display display;
private form props;
private command exitcommand = new command("exit", command.exit, 1);
public prop()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("system properties");
props.append("hello world!\n");
long time=system.currenttimemillis();
props.append("current time:"+time+"\n");
props.append("microedition.configuration:"+
system.getproperty("microedition.configuration")+"\n");
props.append("microedition.profiles:"+
system.getproperty("microedition.profiles")+"\n");
props.append("microedition.platform:"+
system.getproperty("microedition.platform")+"\n");
props.append("microedition.locale:"+
system.getproperty("microedition.locale")+"\n");
props.append("microedition.encoding:"+
system.getproperty("microedition.encoding")+"\n");
props.append("java.version:"+system.getproperty("java.version")+"\n");
/
/null
props.append("java.vendor:"+system.getproperty("java.vendor")+"\n");
//n
ull
props.append("java.vm.name:"+system.getproperty("java.vm.name")+"\n");
/
/null
props.append("java.vm.version:"+system.getproperty("java.vm.
version")+"
\n");//
null
props.append("os.name:"+system.getproperty("os.name")+"\n");//nu
props.append("os.arch:"+system.getproperty("os.arch")+"\n");//nu
props.append("os.version:"+system.getproperty("os.version")+"\n");
//nul
l
props.append("user.name:"+system.getproperty("user.name")+"\n");
//null
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
这个程序的作用是输出系统中各个环境属性的值。诀窍是使用system类的
getproperty()方法。请注意,j2me核心包的system类已经不支持getproperties()方法了,而且很多环境属性都不再支持了,比如java.version、java.vendor等等。
--请看程序(memory.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class memory extends midlet implements commandlistener
{
private display display;
private form props;
private command exitcommand = new command("exit", command.exit, 1);
public memory()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("runtime information");
long total=runtime.getruntime().totalmemory();
long free=runtime.getruntime().freememory();
props.append("total memory:"+total+"\n");
props.append("free memory:"+free+"\n");
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
这个程序的诀窍是利用runtime类的totalmemory()方法以及freememory()方法。
j2me中的
runtime类不再具有执行外部程序的功能了,这是很显然的。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[from: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: java
标 题: j2me学习札记(15)----list对象
发信站: 北大未名站 (2001年10月20日20:32:00 星期六) , 站内信件
list属于javax.microedition.lcdui包,它和form一样,同样属于容器类型的对象。属于容器类型的对象还有textbox和alert。我们在下面还会介绍这两个类的用法。此处介绍list的用法。请看下面的程序(formlist.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class formlist extends midlet implements commandlistener
{
private display display;
private list list;
private command exitcommand = new command("exit", command.exit, 1);
public formlist()
{
display = display.getdisplay(this);
}
public void startapp()
{
list= new list("choose url", choice.exclusive);
list.append("www.pku.edu.cn",null);
list.append("www.yahoo.com",null);
list.append("fancyrainbow@263.net",null);
list.addcommand(exitcommand);
list.setcommandlistener(this);
display.setcurrent(list);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
list = null;
}
}
请大家留意startapp()方法的内部:
list= new list("choose url", choice.exclusive);
list.append("www.pku.edu.cn",null);
list.append("www.yahoo.com",null);
list.append("fancyrainbow@263.net",null);
list.addcommand(exitcommand);
list.setcommandlistener(this);
display.setcurrent(list);
其逻辑流程如下:首先调用构造函数实例化一个list对象(list),list对象实际上
代表一个选择列表。list类的构造函数的第一个参数是选择列表的名字,第二个参数是选择列表的形式, choice.exclusive表示这个选择列表只能够单选。如果是choice.multiple,则表示这个选择列表可以多选。list类的append()方法有两个参数,第一个参数是选择项的描述,第二个参数是一个image对象,代表每个选择项前面的小图标。第二个参数可以是null值,但是
第一个参
数是必须的。我们同样可以使用addcommand()方法往list中注册命令,也可以使用
setcomman
dlistener()方法指定命令监听者,这和form是一样的。在startapp()方法的最后,
使
用displ
ay对象的setcurrent()方法将list对象设定为当前的屏幕显示对象。
formlist.java程序的运行效果如下图所示:
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[from: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: java
标 题: j2me学习札记(16)-----command对象
发信站: 北大未名站 (2001年10月20日20:33:56 星期六) , 站内信件
在前面我们其实已经使用过command对象了。j2me的事件系统比较特殊,你必须首先定义一系列的命令,然后注册到容器对象中,例如(form、alert、list、textbox),再设定命令监听者,编写好commandaction()方法即可。当系统发送某个命令,便由commandaction()方法进行统筹处理。下面的程序演示了如何定义多个命令以及如何编写commandaction()方法
。
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class cmd extends midlet implements commandlistener
{
private display display;
private form props;
private command backcommand = new command("back", command.back, 2);
private command cancelcommand = new command("cancel", command.cancel,
1);
private command exitcommand = new command("exit", command.exit, 1);
private command helpcommand = new command("help", command.help, 1);
private command itemcommand = new command("item", command.item, 1);
private command okcommand = new command("ok", command.ok, 1);
private command screencommand = new command("screen", command.screen,
1);
private command stopcommand = new command("stop", command.stop, 1);
public cmd()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("hello world");
props.append("hello world!\n");
props.addcommand(backcommand);
props.addcommand(cancelcommand);
props.addcommand(exitcommand);
props.addcommand(helpcommand);
props.addcommand(itemcommand);
props.addcommand(okcommand);
props.addcommand(screencommand);
props.addcommand(stopcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void showscreen(string cmd)
{
form form=new form("show cmd");
form.append(cmd);
form.addcommand(exitcommand);
form.setcommandlistener(this);
display.setcurrent(form);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
else if(c==helpcommand)
{
showscreen("help");
}
else if(c==backcommand)
{
showscreen("back");
}
else if(c==cancelcommand)
{
showscreen("cancel");
}
else if(c==itemcommand)
{
showscreen("item");
}
else if(c==okcommand)
{
showscreen("ok");
}
else if(c==screencommand)
{
showscreen("screen");
}
if(c==stopcommand)
{
showscreen("stop");
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
在上面的程序(cmd.java)中定义了八个命令。如果commandaction()方法接到这八个命令,多半是调用showscreen()方法,将这几个命令输出。showscreen()方法会产生一个新的容器对象(form),作为当前的屏幕,并把截获的命令显示在屏幕中。
cmd.java的运行效果如下2图所示(当屏幕出现hello world字样的时候,你需要按
下退出键,命令菜单就会出现了,你可以依次执行各个命令)。
textbox是一个容器类型的对象(和form的性质一样)。用法如下所示:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class showtextbox extends midlet implements commandlistener
{
private display display;
private textbox txtbox;
private command exitcommand = new command("exit", command.exit, 1);
public showtextbox()
{
display = display.getdisplay(this);
}
public void startapp()
{
//or :
//string str="hello world";
//txtbox = new textbox("text box",str,str.length(),0);
//the follow code is wrong:
//txtbox = new textbox("text box",str,any number here,0);
txtbox = new textbox("text box",null,200,0);
txtbox.addcommand(exitcommand);
txtbox.setcommandlistener(this);
display.setcurrent(txtbox);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
txtbox = null;
}
}
请注意textbox类的构造函数,第一个参数实际上是窗口的名称(因为textbox是一个容器,可能是当前屏幕的显示对象),第二个参数是缺省值,第三个参数是输入字符的总长度。如果你设置了文本框的缺省值,那么第三个参数必须是缺省字符的长度。如果第三个参数的值和缺省字符的长度不一样,那么程序运行不成功(编译可以通过)。如果你将第二个参数置为null值,那么第三个参数可以任意设。
textfield和textbox有点相似,不过textbox是多行的,而textfield是单行的。而且textbox是容器类型的对象,但是textfield是项目类型的对象,只能够被容器包含,不能够单独显示。
textfield文本域对象的用法如下所示:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class showtextfield extends midlet implements commandlistener
{
private display display;
private form props;
private textfield txtfield;
private command exitcommand = new command("exit", command.exit, 1);
public showtextfield()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("hello world");
props.append("hello world!\n");
txtfield=new textfield("email:", "", 15,textfield.emailaddr);
props.append(txtfield);
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
请注意startapp()方法,我们使用form对象作为当前屏幕的显示对象,而将
textfield对象作为form的一个子项目显示。下面来介绍textfield类的构造函数,第一个参数是文本域的名称,第二个参数是缺省值,第三个参数是长度,第四个参数是文本域的类型,可选的值有:
textfield.password、textfield.emailaddr、textfield.phonenumber、textfield.
url、textfield. numeric等等。构造好textfield对象之后,调用form的append()方法将它添加到form对象的子项目中。showtextfield.java程序的运行效果如下图所示:
datefield对象和textfield对象一样同属于项目类型的对象,不能够单独显示,必须作为容器对象的子项目显示。datefield对象的作用是显示一个日期,它和windows控制面板中的时间和日期设置程序有点近似。datefield对象的用法如下所示:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class showdatefield extends midlet implements commandlistener
{
private display display;
private form props;
private datefield datfield;
private command exitcommand = new command("exit", command.exit, 1);
public showdatefield()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("hello world");
props.append("hello world!\n");
//change:
//datfield=new datefield("date:",datefield.date_time);
//datfield=new datefield("date:",datefield.time);
datfield=new datefield("date:",datefield.date);
props.append(datfield);
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
}
showdatefield.java程序的运行效果如下面两图所示:
stringitem对象和textfield、datefield对象类似,同样属于项目类型的对象。它的作用就是在容器对象中显示一条字符串。
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class showstringitem extends midlet implements commandlistener
{
private display display;
private form props;
private stringitem stritem;
private stringitem stritem2;
private command exitcommand = new command("exit", command.exit, 1);
public showstringitem()
{
display = display.getdisplay(this);
}
public void startapp()
{
props = new form("hello world");
props.append("hello world!\n");
stritem=new stringitem("signature:","小楼一夜听春雨");
stritem2=new stringitem("signature:","三教明天考物化");
props.append(stritem);
props.append(stritem2);
props.addcommand(exitcommand);
props.setcommandlistener(this);
display.setcurrent(props);
}
public void commandaction(command c, displayable s)
{
if (c == exitcommand)
{
destroyapp(false);
notifydestroyed();
}
}
public void destroyapp(boolean unconditional)
{
}
public void pauseapp()
{
display.setcurrent(null);
props = null;
}
from pku
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器