J2ME学习笔记整理(二)

作者:夏彦端

接下来我们来介绍一下LCDUI这个包及其相关内容,大家都知道,在J2SE里面我们用AWT或者SWING来开发用户界面,但是在J2ME里面,开发用户界面并非上述的AWT或者SWING,我们使用的是全新的针对移动设备设计的LCDUI包(即Limited Configuration Device User Interface)。

下图是LCDUI包的简要结构:

MIDP中,和用户界面相关的回调函数有四个:

(1)       javax.microedition.lcdui.Command;

(2)       javax.microedition.lcdui.Canvas

(3)   在屏幕重绘时,会产生重绘事件,此时的Canvas类的paint()方法会被调用,并传入一个Graphics对象的调用;

(4)  调用Display类的callSerially()方法时,会传入一个Runnable接口的类,其中的run()方法会被调用。

 

下面我们来介绍一下javax.microedition.lcdui.Command这个类,它既适用于高级API(Screen),又使用于低级API(Canvas).

Command类有两种构造函数,一个有三个参数,另一个则是四个参数。

区别在于:前者第一个参数是显示在画面上名称,第二个参数是命令的类型,第三参数是优先权,以自然数形式表示,如:123…,越小优先权越高,代表在屏幕显眼的地方显示。而后者则是在前者的基础上增加了一个长命令的参数,具体位于前者第一和第二个参数之间,具体机型上的显示和厂家的实现的不同而不同。

前面介绍的命令的类型共分为8种:Command.BACKommand.EXITCommand.CANCELCommand.HELPCommand.ITEMCommand.OKCommand.SCREENCommand.STOP

例:

   Command c=new Command(“取消”,Command.CANCEL,1);

   Command a=new Command(“这是长命令”,”这是短命令”,Command.BACK,1);

在屏幕上光显示出这些是没有任何意义的,我们必须还要将Command类和javax.microedition.lcdui.CommandListener结合起来使用才能反应用户的动作,由于setCommandListener()定义于Displayable中,所以CommandListener是一个和Command一样可以通用与高级API和低级API的事件处理接口。

 

 

需要注意的是CommandListener采用的是Unicast机制,也就是说,同一时刻只能注册一个时间处理函数。

下面是一个在MIDlet中使用CommandCommandListener的大致情形:

public class example1 extends MIDlet implements CommandListener

{

 public void startApp()

{

………

 Command exp1=new Command(“命令 1” ,Command.OK,1);

………

}

public void pauseApp()

{

………

}

public void destroyApp(boolean exp)

{

………

}

public void commandAction(Command c,Displayable s)

{

………

}

}

介绍完了Command类,我们来介绍一下Ticker类,在MIDP1.0中,它只能用于Screen的子类,在MIDP2.0后,已经可以用于Displayable的所有子类了。它是一个类似于跑马灯的类,即通常所见的进度条,我们通常用setTicker()来设定画面上的Ticker,或者用getTicker()来取得画面上的Ticker对象,setTicker()中的括号内的双引号中的字符串即显示在跑马灯中的文字。

下面用一个例子来详细介绍一下上面几个类的用法,作为本章的小结。

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class DisplayableTestMIDlet extends MIDlet implements CommandListener

{

       public void startApp()

       {

              display=Display.getDisplay(this);

       }

       public void pauseApp()

       {

              f=new Form("Displayable测试");

              Command test1=new Command("开始Ticker",Command.SCREEN,1);

              Command test2=new Command("停止Ticker",Command.SCREEN,1);

              Command test3=new Command("退出",Command.EXIT,1);

              f.addCommand(test1);

              f.addCommand(test2);

              f.addCommand(test3);

              f.setCommandListener(this);

              display.setCurrent(f);

       }

       public void destroyApp(boolean unconditional)

       {

             

       }

       public void commandAction(Command c,Displayable s)

       {

              String cmd=c.getLabel();

              if(cmd.equals("开始Ticker"))

              {

                     f.setTicker(new Ticker("运作中"));

              }

              if(cmd.equals("停止Ticker"))

              {

                     f.setTicker(null);

              }

       }

       private Display display;

       Form f;

}

 

Screen类有四个相关的子类,分别为Alert,List,TextBox,Form,这四个子类可以细分为两类,前三者属于封装了较复杂用户界面的类,我们只能单纯的拿来使用,对于其内部的组成结构无法修改;相对前三者,Form则是自由的多,它是默认缺省没有任何用户界面的组件,它类似于一个容器,可以容纳Item类的子类,以构成复杂的图形用户界面.

 

 

   下面我们来详细介绍一下这四个子类:

List组件根据Choice接口中的定义,分为Choice.EXCLUSIVE,Choice.MULTIPLE,Choice.IMPLICIT三种,它们之间的区别也很简单,你只需从字面便可读出区别来,分别为单选类型的,多选类型的,简易式的单选,IMPLICITEXCLUSIVE的最大区别在于,Choice.IMLICIT类型的List会在用户选择之后立刻触发时间,并将List.SELECT_COMMAND做为commandAction()函数的第一个参数传入,经由次判别,我们可以知道事件是否由List触发,因为这种类型的List在同一时间只有一个选项会被选择。Choice接口给List提供了一种叫Fit Policy的机制,分别为Choice.TEXT_WRAP_DEFAULT,Choice.TEXT_WRAP_ON,Choice.TEXT_WRAP_OFF三种,它们用来决定过长的文字如何被处理,使用Choice.TEXT_WRAP_ON时,过长的文字会自动编排到下一行,而Choice.TEXT_WRAP_OFF则市自动截断,DEFAULT则是根据厂家默认来选择。

代码示范如下:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class ImplicitListWithFitPolicyMIDlet extends MIDlet implements CommandListener

{

       private Display display;

       public ImplicitListWithFitPolicyMIDlet()

       {

              display=Display.getDisplay(this);

       }

       public void startApp()

       {

              Image img=null;

              try

              {

                     img=Image.createImage("/A.png");

              }catch(Exception e)

              {

                     System.out.println(e);

              }

              List l=new List("List测试",Choice.IMPLICIT);

              System.out.println("缺省的Fit Policy:"+l.getFitPolicy());

              l.append("12345678901234567890",img);

              l.append("abcdefgabcdefg",img);

              Command c1=new Command("WRAP_OFF",Command.OK,1);

              l.addCommand(c1);

              Command c2=new Command("WRAP_ON",Command.OK,1);

              l.addCommand(c2);

              Command c3=new Command("WRAP_DEFAULT",Command.OK,1);

              l.addCommand(c3);

              l.setCommandListener(this);

              display.setCurrent(l);

       }

       public void commandAction(Command c,Displayable s)

       {

              String cmd=c.getLabel();

              if(cmd.equals("WRAP_OFF"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_OFF);

              }

              if(cmd.equals("WRAP_ON"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_ON);

              }

              if(cmd.equals("WRAP_DEFAULT"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_DEFAULT);

              }

       }

       public void pauseApp()

       {

             

       }

       public void destroyApp(boolean unconditional)

       {

             

       }

}

下面我们再来说一说TextBox,当用户需要输入文字时,TextBox就派上用场了,TextBox定义使用如下:TextBox tb=new TextBox(“文字输入测试”,”名字”,9TextField.ANY);

其中输入测试Title,名字则是我们指的内容,第三个参数就是我们要限制的参数2的字符数,第四个参数则是对输入内容做了更进一步的限制,ANY指的是允许输入任何字符或数字,类似还有EMAILADDR则是指允许输入电子邮件地址,等等(参见API说明文档)。

下面介绍一下AlertType,它是一个工具类,本身是无法实体化的它提供了几种定义好的AlertType用以辅助Alert类的使用。比如:ALARM(警报),CONFIRMATION(确定),ERROR(错误)等等,Alert是一个比较特殊的Screen类的对象,当我们利用Display.setCurrent()这个方法的时候,它会先发出一段声音,然后将自己显示在屏幕上,过一段时间后,跳回之前的画面,因此,请注意,我们必须要使系统一定要存在一个画面,这样才能让Alert条回,否则,会发生错误,下面一段代码提示Alert的使用:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class AlertSplashScreenMIDlet extends MIDlet

{

private Display display;

public AlertSplashScreenMIDlet()

{

 display=Display.getDisplay(this);

}

public void startApp()

{

Alert a1=new Alert(“应用程序开始启动”);

a1.setType(AlertType.INFO);

setTimeout(5000);

a1.setString(“应用程序初始化中,请稍等”);

Form f=new Form(“主画面”);

dsplay.setCurrent(a1,f);

}

public void pauseApp()

{

}

public void destroyApp(boolean unconditional)

{

}

}

至于Form,是这个Screen类中最终要的一个子类,是高级图形界面中最长用到的,我们留在后面的章节中继续探讨它~

 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=205

代码示范如下:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class ImplicitListWithFitPolicyMIDlet extends MIDlet implements CommandListener

{

       private Display display;

       public ImplicitListWithFitPolicyMIDlet()

       {

              display=Display.getDisplay(this);

       }

       public void startApp()

       {

              Image img=null;

              try

              {

                     img=Image.createImage("/A.png");

              }catch(Exception e)

              {

                     System.out.println(e);

              }

              List l=new List("List测试",Choice.IMPLICIT);

              System.out.println("缺省的Fit Policy:"+l.getFitPolicy());

              l.append("12345678901234567890",img);

              l.append("abcdefgabcdefg",img);

              Command c1=new Command("WRAP_OFF",Command.OK,1);

              l.addCommand(c1);

              Command c2=new Command("WRAP_ON",Command.OK,1);

              l.addCommand(c2);

              Command c3=new Command("WRAP_DEFAULT",Command.OK,1);

              l.addCommand(c3);

              l.setCommandListener(this);

              display.setCurrent(l);

       }

       public void commandAction(Command c,Displayable s)

       {

              String cmd=c.getLabel();

              if(cmd.equals("WRAP_OFF"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_OFF);

              }

              if(cmd.equals("WRAP_ON"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_ON);

              }

              if(cmd.equals("WRAP_DEFAULT"))

              {

                     List tmp=(List) s;

                     tmp.setFitPolicy(Choice.TEXT_WRAP_DEFAULT);

              }

       }

       public void pauseApp()

       {

             

       }

       public void destroyApp(boolean unconditional)

       {

             

       }

}

下面我们再来说一说TextBox,当用户需要输入文字时,TextBox就派上用场了,TextBox定义使用如下:TextBox tb=new TextBox(“文字输入测试”,”名字”,9TextField.ANY);

其中输入测试Title,名字则是我们指的内容,第三个参数就是我们要限制的参数2的字符数,第四个参数则是对输入内容做了更进一步的限制,ANY指的是允许输入任何字符或数字,类似还有EMAILADDR则是指允许输入电子邮件地址,等等(参见API说明文档)。

下面介绍一下AlertType,它是一个工具类,本身是无法实体化的它提供了几种定义好的AlertType用以辅助Alert类的使用。比如:ALARM(警报),CONFIRMATION(确定),ERROR(错误)等等,Alert是一个比较特殊的Screen类的对象,当我们利用Display.setCurrent()这个方法的时候,它会先发出一段声音,然后将自己显示在屏幕上,过一段时间后,跳回之前的画面,因此,请注意,我们必须要使系统一定要存在一个画面,这样才能让Alert条回,否则,会发生错误,下面一段代码提示Alert的使用:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class AlertSplashScreenMIDlet extends MIDlet

{

private Display display;

public AlertSplashScreenMIDlet()

{

 display=Display.getDisplay(this);

}

public void startApp()

{

Alert a1=new Alert(“应用程序开始启动”);

a1.setType(AlertType.INFO);

setTimeout(5000);

a1.setString(“应用程序初始化中,请稍等”);

Form f=new Form(“主画面”);

dsplay.setCurrent(a1,f);

}

public void pauseApp()

{

}

public void destroyApp(boolean unconditional)

{

}

}

至于Form,是这个Screen类中最终要的一个子类,是高级图形界面中最长用到的,我们留在后面的章节中继续探讨它~

 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=205

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值