J2ME学习札记9-20

标 题: J2ME学习札记(9)-------HelloWorld解释一
发信站: 北大未名站 (2001年10月18日23:00:21 星期四) , 站内信件
要停电了,只好写道这里了。
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对象,注册到程序中。当设备发生了某个事件,会产生

应的Co
mmand对象,并把它传递给一个事件处理函数----commandAction(),由它对所产生的

件做统
筹处理。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(10)--------HelloWorld解释二
发信站: 北大未名站 (2001年10月19日16:22:06 星期五) , 站内信件
6)
public HelloWorld()
{
display = Display.getDisplay(this);
}
这个是构造函数,函数内部,调用Display对象的静态方法---getDisplay(),获取

幕对象,
幕对象,
实例化display变量。这个调用是必要的。你可以在构造函数中做这个工作,也可以

startA
pp()方法中做这个工作。推荐在构造函数中完成。
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()方法。这个方法是父类的抽象方法,在子类中必须予以覆盖。首
先实
例化F
orm对象----------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()方法的作用
是暂
停程序
,并销毁容器对象或者是画布对象。手机屏幕将会是一片空白。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(11)------J2ME的类库结构
发信站: 北大未名站 (2001年10月19日16:32:27 星期五) , 站内信件
javax.microedition.lcdui:用户界面包,主要用于构造程序的用户界面。
Command、Form

是这个包的类。
javax.microedition.rms:这个包实现了对手机数据的存取功能。
javax.microedition.midlet:这个包是MIDlet程序的声明周期包,主要定义了
MIDlet
类,MIDl
et类是一个抽象类,里面声明了startApp()、destroyApp()、pauseApp()等抽象方
法。
javax.microedition.io:网络IO包。有HttpConnection接口和Connection接口、
Datagram接
口。
java.io.*
java.lang.*
java.util.*
上面这三个包属于J2ME核心包,J2ME中的核心包和J2SE中的同名核心包有些差别,主
要是功能
大大简化了,许多类、方法都没有了,只能实现一些最基本的功能。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(12)---J2ME开发中的中文问题
发信站: 北大未名站 (2001年10月19日16:49:29 星期五) , 站内信件
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按钮

行程序。
行程序。
Poem的运行效果如下图所示。
注意:每新编写一个程序,都要按照这个步骤进行配置,再编译运行,我以后就不再

复描述
这个步骤了。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(12)补-----运行效果图
发信站: 北大未名站 (2001年10月19日16:50:44 星期五) , 站内信件
rt,不好意思,忘了。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
附件列表 (使用WWW方式可以查看附件):
1: temp2.bmp
附件1: temp2.bmp
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(13)----查看系统属性
发信站: 北大未名站 (2001年10月19日17:02:51 星期五) , 站内信件
请看下面的代码(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");//nuull
props.append("os.arch:"+System.getProperty("os.arch")+"/n");//nuull
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等等。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(14)----查看内存利用情况
发信站: 北大未名站 (2001年10月19日17:08:32 星期五) , 站内信件
请看程序(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。我们在下面还会介绍这两个类的用法。此处首

介绍Li
st的用法。请看下面的程序(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);
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字样的时候,你需要按
下退出键
,命令菜单就会出现了,你可以依次执行各个命令)。
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(17)-----TextBox文本框对象
发信站: 北大未名站 (2001年10月20日20:36:34 星期六) , 站内信件
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
值,那
么第三个参数可以任意设。
ShowTextBox.java的运行效果如下图所示:
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(18)-----TextField文本域对象
发信站: 北大未名站 (2001年10月20日20:37:59 星期六) , 站内信件
TextField和TextBox有点相似,不过TextBox是多行的,而TextField是单行的。而
且TextBo
x是容器类型的对象,但是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类的构造函数,第一个参数是文本

的名称
,第二个参数是缺省值,第三个参数是长度,第四个参数是文本域的类型,可选的值有
:
TextFi
eld.PASSWORD、TextField.EMAILADDR、TextField.PHONENUMBER、TextField.
URL、
TextFi
eld. NUMERIC等等。构造好TextField对象之后,调用Form的append()方法将它添加
到Form对
象的子项目中。ShowTextField.java程序的运行效果如下图所示:
--
小楼一夜听春雨,深巷明朝卖杏花。
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.106.162]
发信人: javalover (欲下未下风悠扬), 信区: Java
标 题: J2ME学习札记(19)-----DateField对象
发信站: 北大未名站 (2001年10月20日20:39:14 星期六) , 站内信件
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程序的运行效果如下面两图所示: 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值