栏目分类
开源技术 | Hibernate | JUnit | Tomcat | JBoss | eclipse | Spring | ANT | Struts
java新手入门 | 基础入门 | 开发工具 | JDK | oop面向对象 | 安全配置
J2EE | mvcwea | 应用服务器 | Rmi/Corba/Jini | J2ee核心 | Servlet/JSP | EJB | JDBC/JDO
J2ME | 核心技术 | 嵌入式 | 无线开发
XML | WebServices | XMLBeans
高级技术 | 多线程 | 设计模式 | ULM/OO | p2p/Jxta | JavaSecurity
核心技术 | SwingAwtApplet | 高级编程 | 网络编程 | Jvm技术 | JavaMedia
其它技术 | 资讯动态
排行榜
·J2ME基础入门教程
·熟练使用J2ME在实际开发中的可选包MMAPI
·新手入门之j2me学习方法总结--摘录篇
·J2ME程序开发新手入门九大要点
·J2ME综合:如何在MIDP中实现图片放缩
·J2ME与WebService-KSOAP快速上手
·如何使用“月蚀”进行J2ME开发
·J2ME概述
·J2ME进度条与线程化模型实例解析
·J2ME实现可伸展目录树TreeList(图)
·J2ME的现状与发展
·告诉你J2ME是什么
·知己知彼——J2ME技术详
·Java思路开发易于移植的J2ME游戏
·关于J2ME——MIDP1.0中的碰撞检测
·J2ME工具:使用j2meunit进行游戏测试
·在J2ME中读取各种格式的文本文件
·如何搭建J2ME的开发环境之一二
·J2ME学习系列之如何将J2ME与XML集成
·使用J2ME中的page进行编码转化

    您现在的位置: Linux宝库 >> Java >> J2ME >> 核心技术 >> 文章正文
J2ME实现可伸展目录树TreeList(图)
Linux宝库 收集整理  作者:Linux宝库  时间:2007-12-31  收藏本站
来自:http://doc.linuxpk.com/45910.html
联系:linuxmine#gmail.com
分类:[核心技术]
  J2ME里面有自带的List类,但是功能太弱,没有实现View和Model的分离,所以操作起来比较费事。本来事想写一个Canvas的TreeList,但是画起来算坐标又太麻烦,所以选取了一个折中的方法,继承List,实现一个操作起来比较方便的组件。

  目的:

  1.可伸缩的目录树结构,暂时先实现两层。

  2.Label和存储内容分离。

  3.激活和非激活图片分开。

  4.通过选择事件可以准确快速找到对应内容

  5.存储内容无关性,里面可以放置任何Object

  实现思路:

  1.封装一个ExpandItem类,用来存储每一条数据。

  /**

  * 默认图片

  */

  private

  String imagePath="";

  /*

  * 激活图片,如果为空说明此图片无效

  */

  private String selectImgPath=null;

  /**

  * 组

  */

  public static int GROUP=1;

  /**

  * 记录

  */

  public static int ITEM=0;

  /**

  * 是否选中,如果选中则默认为展开状态

  */

  private boolean ifselected=false;

  /**

  * 显示Label

  */

  private String label;

  /**

  * 类型:组,记录

  */

  private int type;

  /**

  * 存储的对象

  */

  GROUP表示这个ITEM是一个父节点,下面包含字节点,这样它的Content将是一个Vector.

  ITEM表示这个ITEM是根节点。

  selectImgPath,是激活后的图标,可以为空,为空的时候选择了这个ITEM图标不变。

  然后就是ExpandList类,此类的数据结构如下:

  private Vector itemList = new Vector();

  /*用来存储内容的数据结构*/

  private ExpandListItem currentSelectedObject = null;

  /*当前所选择的对象,方便获取*/

  private int currentSelectedIndex = -1;

  /*当前选择的对象在队列中的Index,队列有两个,一个是真实数据的存储Vector,另外一个是显示在屏幕上的队列。这两个有时候是不一样的。因为有的节点有子节点*/

  private Vector appearHookList = new Vector();

  /*显示在屏幕上的Label队列*/

  总的思路如下:

  初始化List的时候,参数是一个Vector,里面可以是ExpandItem或者是Vector.然后根据ExpandItem里面的参数初始化屏幕,如果GROUP节点的ifselected状态为True则递归添加下面的子节点,否则只插入当前节点。图标也是一样,如果ifselected为True 则用激活图标否则用默认图标。

  在用户选择了一个结点后,取得当前的激活的Index号码,判断是不是父节点,如果是的话,首先更新这个父节点的Ifselected属性为True,然后重画这个List;(其实效率更高的方法是直接插入这个父节点的子节点,但是这样做的话,在移除的时候会稍微稍微麻烦一点。有时间我在改过来,呵呵)。如果选择的是子节点,则判断是否有激活图标,如果有,则更新这个图标,就好了。

  下面是效果

  


  附代码一份,这是我ME组件库中很早的版本了,呵呵。别的组件以后在写。其实最好的方法就是写Canvas。

  --------------------------------------------------------------------------------

  ExpandList.java

  package com.skystudio.ExpandList;

  public class ExpandListItem {

  public ExpandListItem(Object content,String imgPath,String selectImgPath,String Label,int type,boolean ifselected){

  this.selectImgPath=selectImgPath;

  this.imagePath=imgPath;

  this.content=content;

  this.label=Label;

  this.type=type;

  this.ifselected=ifselected;

  }

  /**

  * 默认图片

  */

  private

  String imagePath="";

  /*

  * 激活图片,如果为空说明此图片无效

  */

  private String selectImgPath=null;

  /**

  * 组

  */

  public static int GROUP=1;

  /**

  * 记录

  */

  public static int ITEM=0;

  /**

  * 是否选中

  */

  private boolean ifselected=false;

  /**

  * 显示Label

  */

  private String label;

  /**

  * 类型:组,记录

  */

  private int type;

  /**

  * 存储的对象

  */

  private Object content;

  public Object getContent() {

  return content;

  }

  public void setContent(Object content) {

  this.content = content;

  }

  public String getLabel() {

  return label;

  }

  public void setLabel(String label) {

  this.label = label;

  }

  public int getType() {

  return type;

  }

  public void setType(int type) {

  this.type = type;

  }

  public boolean Ifselected() {

  return ifselected;

  }

  public void setIfselected(boolean ifselected) {

  this.ifselected = ifselected;

  }

  public String toString() {

  return this.label+"

  ";

  }

  public String getImagePath() {

  return imagePath;

  }

  public void setImagePath(String imagePath) {

  this.imagePath = imagePath;

  }

  public String getSelectImgPath() {

  return selectImgPath;

  }

  public void setSelectImgPath(String selectImgPath) {

  this.selectImgPath = selectImgPath;

  }

  }

  --------------------------------------------------------------------------------

  package com.skystudio.ExpandList;

  import java.util.Vector;

  import javax.microedition.lcdui.Command;

  import javax.microedition.lcdui.CommandListener;

  import javax.microedition.lcdui.Displayable;

  import javax.microedition.lcdui.Image;

  import javax.microedition.lcdui.List;

  import com.skystudio.ui.toolkit.Util;

  /**

  * @author sky

  *

  */

  public class ExpandList extends List implements CommandListener {

  private Vector itemList = new Vector();

  private ExpandListItem currentSelectedObject = null;

  private int currentSelectedIndex = -1;

  private Vector appearHookList = new Vector();

  public ExpandList(String title, int type, Vector itemList) {

  super(title, type);

  this.itemList = itemList;

  this.setCommandListener(this);

  LoadList();

  }

  public void appendItem(ExpandListItem item, Image icon, boolean ifSub) {

  appearHookList.addElement(item);

  System.out.println("Add current display list:" + item);

  if (!ifSub) {

  this.append(item.getLabel(), icon);

  } else {

  this.append(" " + item.getLabel(), icon);

  }

  }

  public void Init() {

  int count = this.size();

  for (int i = 0; i < count; i++) {

  this.delete(0);

  }

  this.appearHookList.removeAllElements();

  System.out.println("Now itemList:" + this.itemList);

  }

  public void LoadList() {

  Init();

  for (int i = 0; i < itemList.size(); i++) {

  ExpandListItem elItem = (ExpandListItem) itemList.elementAt(i);

  if (elItem.getType() == ExpandListItem.GROUP) {

  Image icon = Util.getImage(elItem.getImagePath());

  /**

  * @Debug

  */

  if (elItem.Ifselected()) {

  if (elItem.getSelectImgPath() != null) {

  icon = Util.getImage(elItem.getSelectImgPath());

  }

  System.out.println("Add Parent Node:");

  this.appendItem(elItem, icon, false);

  Vector group = (Vector) elItem.getContent();

  for (int j = 0; j < group.size(); j++) {

  ExpandListItem item = (ExpandListItem) group

  .elementAt(j);

  Image ic = Util.getImage(item.getImagePath());

  System.out.println("Add Sub Node:");

  this.appendItem(item, ic, true);

  }

  } else {

  System.out.println("Add Leave Node:");

  this.appendItem(elItem, icon, false);

  }

  } else if (elItem.getType() == ExpandListItem.ITEM) {

  Image icon = Util.getImage(elItem.getImagePath());

  this.appendItem(elItem, icon, false);

  }

  }

  if (this.currentSelectedIndex != -1) {

  thi 本文来自:http://doc.linuxpk.com/45910.html

 
     最新更新
·深入了解J2ME的几个重要概念
·J2ME学习笔记(6)—连接MIDlet到文本文件
·J2ME学习笔记(5)—MIDlets中的图形编程
·J2ME学习笔记(4)—用MIDPAPI开发MIDlets
·J2ME学习笔记(3)—初次接触MIDlets
·J2ME学习笔记(2)—平台体系结构详解
·J2ME学习笔记(1)—平台介绍及简单实例
·J2METimer-更简单的实现多任务调度执行
·J2ME基础知识
·J2MEMIDP提供的最重要的图形元素
·精通J2ME中的HelloWorld
·J2METimer使用指南
·请关注J2MEWTK2.2的新特性
·详细介绍并掌握J2ME的安全结构
·如何使用“月蚀”进行J2ME开发
·如何搭建J2ME的开发环境之一二
·J2ME编程实例---之数字键的测试
·利用J2ME与ASP建立数据库连接
·J2ME平台构件及开发应用程序示例
·J2ME(CLDC/MIDP)简介
·关于J2MEMIDP1.0.3中的安全问题简述
·学习在J2ME中使用代码
·J2ME的起源和发展历程
·认识了解“J2ME”
·探索J2ME:用GCF通信
·探索J2ME:使用记录管理系统
·探索J2ME:对记录进行排序
·浅析J2EE、J2SE和J2ME
·J2ME应用基础
·探索J2ME:创建开销细节表单