`
izuoyan
  • 浏览: 9220399 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用 MIDP 列表组件

阅读更多

作者:Eric 文章来源:http://gceclub.sun.com.cn

MIDP 将它的用户界面组件分为两组类:高层 API 和底层 API。使用高层 API 你可以使用一组平台独立的抽象类定义你的用户界面,并让 MIDP 实现确定用户界面的外观和操作。底层 API 是你获得完全的画图区域控制并处理原始输入事件。底层 API 在使用底层用户界面 API 中介绍。

本文讨论列表组件,高层 API 的一个组成部分。所有 MIDP 用户界面组件在 javax.microedition.lcdui 包中定义。

列表组件显示一组可选择的字符串。一组可选图案也可以和每个字符串替换使用。实现显示了在一些列表中的字符串显示的准确格式并没有定义并提供了一个途径,是用户能够从列表中的一个项目转换到另一个项目,根据需要选择或不选择某个项目。浏览和选择的处理流程是相互独立的。换句话说,用户可以浏览一个特定的项目,但是并不确定选择与不选择。这是指移动输入指针。

List类是Screen类的扩展,Screen类是高层 API 中所有顶层窗口的基本类。在同一时间段内,只有一个Screen是可见的。一个Screen有一个可选的标题。由于Screen类是Displayable类的扩展,命令对象也可以与List组件相关联。List类也实现Choice界面,它定义了一些方法,这些方法是List组件与高层API的其它组件所共有的:ChoiceGroup组件。

List组件支持三种类型的项目选择。第一种是List.EXCLUSIVE,是用户准确的从列表中选择一个项目。如果用户在选择一个项目时,另一个项目已经被选择了,先前的一个项目将被自动取消选择。从概念上看,列表就像一组Radio Buttons,实现实际上就是用这种方式显示的。第二种是List.MULTIPLE,是用户同时选择零个或多个项目。就好像列表是由一组Checkbox组成的。最后一种是List.IMPLICIT,象是一种排它方式,但是选择一个项目的动作同时也激发一个事件,就像用户激活了一个命令(下面详细介绍)。

List类定义两个构造器。两个构造器都使用屏幕的名称和一个列表方式(List.EXCLUSIVEList.MULTIPLEList.IMPLICIT之中的一个)。第二个构造器也带有一个字符串数组和一个图像数组,用以初始化List。尽管如此,初始化可以分别进行。例如,这是构造项目列表的一种方式:

List l = new List( "Choose fruit:", List.EXCLUSIVE );
l.append( "orange", null );
l.append( "apple", null );
l.append( "pear", null );

另一种方式是使用数组形式的构造器:

String[] fruitNames = { "orange", "apple", "pear" };
List l = new List( "Choose fruit:", List.EXCLUSIVE,
 fruitNames, null );

注意:图像完全是可选项。即使你指定图像,实现也可能忽略它们。这样,无论什么时候一个图像或一组图像被请求时,传递Null比较安全。

在显示一个List组件之前,你会希望为它注册一个命令监听器:

List l = ....;
CommandListener listener = ....; // often "this"
l.setCommandListener( listener );

命令监听器是任何一个实现CommandListener接口的类的实例。通常MIDletMain类是一个监听器。同时只有一个监听器可以被注册。一个采用EXCLUSIVEMULTIPLE方式的列表必须至少注册一个Command对象,否则没有事件会被发送到命令监听器。这是因为在用户操作列表时EXCLUSIVEMULTIPLE方式不会激发任何事件。

一般情况下,为采用IMPLICIT方式的列表,象采用EXCLUSIVEMULTIPLE方式的列表一样,添加命令是一种好主意。在用户从一个IMPLICIT列表种选择项目时,列表使用定义为List.SELECT_COMMAND的特殊命令对象通知它的命令监听器。这个对象在新的项目被选择的时候被作为第一个参数传递到commandAction方法。换句话说,你可以使用如下代码检查implicit选择:

public void commandAction( Command c, Displayable d ){
 if( c == List.SELECT_COMMAND ){
 // implicit selection...
 } else if( ..... ){
 ..... // etc. etc.
 }
}

请确认任何一个响应SELECT_COMMAND的操作对于用户来说是直观的。例如,显示一个电子邮件的列表的List组件可以通过显示选定的电子邮件信息的文本来响应SELECT_COMMAND。其它邮件管理操作是通过相应的注册的命令对象来访问的。

列表的内容,就是列表显示的文本和图像,可以在任何时候修改。列表为此定义了appenddeleteinsertset方法。一个常见的需求,例如,删除列表的一个内容。你可以这样容易的实现:

public static void deleteListContents( List l ){
 int n = l.size();
 while( n-- > 0 ){
 l.delete( n );
 }
}

size方法返回目前在列表中存储的项目的数量。

如果你发现你重复的进行这种操作,你可能希望为你的特性为列表增加参数,就像这样:

public class ExtendedList extends List {
 public ExtendedList( String title, int mode ){
 super( title, mode );
 }
 
public ExtendedList( String title, int mode, 
String[] itemText, Image[] 
 itemImages ){
 super( title, mode, itemText, itemImages );
 }
 
public void deleteAll(){
 int n = size();
 while( n-- > 0 ){
 delete( n );
 }
 }
} 

在一个列表被构造后,你可以在任何时候获得选择的项目的索引。在EXCLUSIVEIMPLICIT方式,使用getSelectedIndex,它返回选择的项目的索引(从0开始):

 List l = ....; // some list
 int which = l.getSelectedIndex();

使用MULTIPLE方式的列表的getSelectedIndex返回-1。因为在任何的指定时间可以返回多于一个的项目。使用getSelectedFlags将每个选择的项目的状态返回到你指定的数组种:

 List l = ....; // some list
 boolean[] selected = new boolean[ l.size() ];
 
l.getSelectedFlags( selected );
 for( int i = 0; i < selected.length; ++i ){
 if( selected[i] ){
 system.out.println( "Item " + i + " is 
 selected!" );
 }
 }

你也可以随时检查每一个选定的项目的状态,是通过调用isSelected来实现。你可以通过调用setSelectedFlagssetSelectedIndex来设置它的状态。例如,如何在MULTIPLE方式列表种所定选择的项目:

public void toggleItems( List l ){
 boolean[] selected = new boolean[ l.size() ];
 l.getSelectedFlags( selected );
 for( int i = 0; i < selected.length; ++i ){
 selected[i] = !selected[i];
 }
 l.setselectedflags( selected );
}

另一个锁定选择的项目的方法是分别设置每一个项目为选择状态:

public void toggleItems( List l ){
 int n = l.size();
 for( int i = 0; i < n; ++i ){
 l.setselectedindex( i, !l.isselected( i ) );
 }
}

后一种方法将导致列表的刷新,无论怎样,它可以避免调用setSelectedFlags

列表中的每一个项目可以有一个关联的图像。一个图像是Image类的一个实例,通常通过Image.createImage得到,并在将图像在MIDlet包的JAR文件中的路径传递给它。例如:

Image checked = null;
Image unchecked = null;
try {
 checked = Image.createImage( "/images/check.png" );
 unchecked = Image.createImage( 
"/images/unchecked.png" );
}
catch( java.io.IOException e ){
}

你也可以通过使用Image类的offscreen缓存器功能来动态创建图像。无论怎样,列表或其它高层用户界面组件中使用的图像必须是不可变的,就是说,它是一个不能修改的图像。更多关于如何动态生成图像的信息,参见Image类文档。

一旦你有了一个或多个图像,你可以通过构造器或作为参数传递个appendinsertset方法,来把它分配给列表的项目。你在构造器中分配图像是传递一个与定义的项目数组同等长度的图像数去给构造器。这里是一个通过append方法分配图像的例子:

List l = ....; // some list
try {
 l.append( "orange", Image.createImage( 
 "/orange.png" ) );
 l.append( "apple", Image.createImage( 
 "/apple.png" ) );
 l.append( "pear", Image.createImage( 
 "/pear.png" ) );
}
catch( IOException e ){
}

尽量使用小的图像,不要超过10-16 pixels。采用同样大小的图像,以确保文本页面的正确。而且不要依赖于图像,确认项目的文本即使在没有图像的情况下,同样是容易理解的。

让我们以一个简单的使用List组件的例子来结束这个tip

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ListDemo extends MIDlet {
 private Display display;
 private int mode = List.IMPLICIT;
 private Command exitCommand = new Command( "Exit",
 Command.SCREEN, 2 );
 private Command selectCommand = new Command( "Select",
 Command.OK, 1 );
 private Command nextCommand = new Command( "Next",
 Command.SCREEN, 2 );
 public ListDemo(){
 }
 protected void destroyApp( boolean unconditional )
 throws MIDletStateChangeException {
 exitMIDlet();
 }
 protected void pauseApp(){
 }
 protected void startApp() throws 
MIDletStateChangeException {
 if( display == null ){ // first time called...
 initMIDlet();
 }
 }
 private void initMIDlet(){
 display = Display.getDisplay( this );
 display.setCurrent( new SampleList( mode ) );
 }
 public void exitMIDlet(){
 notifyDestroyed();
 }
 public static final String[] items = {
 "First", "Second", "Third", "Fourth"
 };
 class SampleList extends List implements 
CommandListener {
 private int mode;
 SampleList( int mode ){
 super( "", mode, items, null );
 addCommand( exitCommand );
 addCommand( selectCommand );
 addCommand( nextCommand );
 setCommandListener( this );
 switch( mode ){
 case IMPLICIT:
 setTitle( "Implicit" );
 break;
 case EXCLUSIVE:
 setTitle( "Exclusive" );
 break;
 case MULTIPLE:
 setTitle( "Multiple" );
 break;
 }
 this.mode = mode;
 }
 public void commandAction( Command c, 
Displayable d ){
 if( c == exitCommand ){
 exitMIDlet();
 } else if( c == selectCommand ){
 showSelection( false );
 } else if( c == SELECT_COMMAND ){
 showSelection( true );
 } else if( c == nextCommand ){
 if( mode == List.IMPLICIT ){
 mode = List.EXCLUSIVE;
 } else if( mode == List.EXCLUSIVE ){
 mode = List.MULTIPLE;
 } else {
 mode = List.IMPLICIT;
 }
 
display.setCurrent( new SampleList( 
mode ) );
 }
 }
 private void showSelection( boolean implicit ){
 Alert alert = new Alert( 
implicit ? "Implicit Selection"
 : "Explicit Selection" );
 StringBuffer buf = new StringBuffer();
 if( mode == MULTIPLE ){
 boolean[] selected = new boolean[ size() ];
 getSelectedFlags( selected );
 for( int i = 0; i < selected.length; ++i ){
 if( selected[i] ){
 if( buf.length() == 0 ){
 buf.append( 
"You selected: " );
 } else {
 buf.append( ", " );
 }
 buf.append( getstring( i ) );
 }
 }
 if( buf.length() == 0 ){
 buf.append( "No items are 
selected." );
 }
 } else {
 buf.append( "You selected " );
 buf.append( getstring( 
getselectedindex() ) );
 }
 alert.setstring( buf.tostring() );
 alert.settimeout( alert.forever );
 display.setcurrent( alert, 
display.getcurrent() );
 }
 }
}
分享到:
评论

相关推荐

    深入MIDP2.0(2) - CLDC与MIDP工具类别

    6. **模拟器和调试工具**:文档可能会讨论如何使用MIDP的模拟器进行应用测试,以及使用J2ME Polish等工具进行开发和调试。 7. **性能优化**:由于资源限制,优化MIDlet的性能是关键。文档可能提供了一些技巧,如...

    Midp2Exe Midp2Exe

    1. MidpRuntimeDLL.dll:这是一个动态链接库(DLL)文件,它可能包含了Midp2Exe所需的运行时组件和Java ME的实现。DLL文件是Windows操作系统中的一个重要部分,它们可以被多个程序共享,以节省内存并提高性能。 2. ...

    J2me中文教程MIDP2.0

    在MIDP 2.0中,开发者可以利用更丰富的UI组件来创建动态的用户界面。例如,`Form` 类允许将多个组件组合在一起,而 `Command` 和 `CommandListener` 接口则用于处理用户的命令操作。 ##### 2. 多媒体集成 MIDP 2.0...

    J2me游戏开发包MIDP2使用示例

    **J2ME游戏开发包MIDP2使用详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。MIDP(Mobile Information Device Profile)是J2ME的一...

    使用MIDP2.0游戏开发

    标题:“使用MIDP2.0游戏开发” 描述:“使用MIDP2.0游戏开发基础知识” MIDP2.0(Mobile Information Device Profile 2.0)是Java ME(Java Platform Micro Edition)的一部分,主要针对移动设备上的应用开发,...

    MIDP2.0 稀有资源 与你分享

    MIDP2.0是Java ME(Micro Edition)平台的一个重要组件,它为移动设备提供了丰富的应用程序开发框架。这一版本的MIDP(Mobile Information Device Profile)是J2ME(Java 2 Platform, Micro Edition)的一部分,用于...

    高效MIDP编程中文版

    书籍会详细讲解如何使用这些组件构建简洁且功能丰富的用户界面,并讨论适配不同屏幕尺寸和方向的策略。 3. **事件处理**:MIDP中的事件模型是理解和实现交互性的重要部分。书籍会教授如何处理用户的触摸和键盘输入...

    midp4palm-1_0

    "Midp4Palm-1_0" 是一个针对Palm设备的Java ME(Micro Edition)平台实现,它使得开发者可以使用MIDP(Mobile Information Device Profile)2.0规范来开发应用程序,并在Palm OS操作系统上运行。MIDP是Java ME的一...

    深入剖析midp 2.0

    1. **增强的用户界面**:MIDP 2.0引入了新的用户界面组件,如列表视图、表格视图等,使得开发者能够创建更加复杂和动态的用户界面。 2. **文件系统访问**:MIDP 2.0允许应用程序直接访问设备的文件系统,这在MIDP ...

    J2me_midp2_0_souce_code.rar_com/sun/midp/jadto_j2me PublicKey_mi

    开发者可以深入研究这些源码来理解 MIDP 的工作原理,学习如何使用特定 API,或者进行自定义扩展。 通过研究 Sun 公司的源代码,开发者可以获取到官方实现的洞察,这对于理解底层机制、调试问题以及优化性能都非常...

    MIDP1.0开发者指导

    1. **用户界面(UI)组件**:MIDP1.0提供了轻量级的用户界面组件,如Canvas和Form,用于创建游戏界面。Canvas允许自定义绘图,而Form则可以包含文本输入和按钮等预定义元素。 2. **数据存储**:Record Management ...

    android平台中使用j2me MIDP2.0中GameAPI

    本文将详细介绍如何在Android环境中使用J2ME MIDP 2.0的Game API,特别是四个关键工具类:Layer、LayerManager、Sprite和TiledLayer。 **Layer** 类在MIDP 2.0中是一个基础组件,它代表了一个可绘制的平面层。Layer...

    实验二 使用MIDP用户界面API编程.doc

    该文档是关于使用MIDP(Mobile Information Device Profile)用户界面API进行编程的实验报告,主要涉及的内容是如何在手持设备上开发一个度量单位转换程序。MIDP是Java ME(Micro Edition)的一个子集,专门用于开发...

    midp2.0 API 包含 NokiaUI

    NokiaUI 是诺基亚公司针对Midp2.0 API 提供的一个扩展,它提供了丰富的用户界面组件和功能,使得开发者能够创建更具吸引力和交互性的移动应用。 Midp2.0 API 主要包含以下组件和服务: 1. **CLDC (Connected ...

    MIDP2.0讲座

    MIDP2.0的用户界面主要基于 Lightweight User Interface Toolkit (LWUIT) 或者后来的 JavaFX Mobile,提供了各种组件,如按钮、文本框、列表和菜单,用于构建互动式界面。开发者可以使用这些组件创建响应式的UI,...

    Java MIDP开发实例集.rar

    MIDP提供了丰富的用户界面组件、网络连接功能以及数据存储能力,使得开发者能够构建具有互动性的移动应用程序,比如游戏、实用工具和娱乐应用。 在"Java MIDP开发实例集.rar"这个压缩包中,我们可以期待找到一系列...

    MIDP和游戏用户界面

    使用低级API集开发的游戏可能是一个简单的益智游戏,如俄罗斯方块,其中主要使用按钮和列表来实现游戏控制和得分显示。 4.5 用户输入 4.5.1 游戏操作 在设计游戏控制时,应考虑移动设备的输入特性,如使用方向键...

    midp2.0教程

    相比早期版本,MIDP2.0提供了更丰富的图形处理能力,支持更高级的用户界面组件,以及增强了网络通信功能,从而使得开发者能够创建更复杂、更具吸引力的游戏。此外,MIDP2.0还引入了Game API,专门用于游戏开发,包括...

    MIDP2.0飞行射击游戏源代码

    【压缩包子文件的文件名称列表】中仅有一个文件名为"Plane",这可能是游戏中的主要角色或关键组件,比如飞机的类文件。在Java编程中,类文件通常以.java为扩展名,代表了一个对象或系统组件的定义。"Plane"可能包含...

    MIDP 2.0 TheGame API

    通过使用MIDP 2.0 TheGame API,开发者可以充分利用移动设备的硬件资源,创造出具有高质量图形和沉浸式游戏体验的移动游戏。`midp2_gameapi.pdf` 文件很可能是详细的API文档,包含了这些类和接口的用法说明,而`...

Global site tag (gtag.js) - Google Analytics