原创 J2ME二级树型目录的实现收藏

新一篇: 索爱手机白屏重启的一个原因 | 旧一篇: FLASH播放出现马赛克

发一个以前写的UI代码吧, 一个可以表现目录树结构的java代码, 当然标题说是实现J2ME中的二级树目录意思是比较适合用在J2ME方面,因为J2ME没有提供这种UI组件形式,但实际应用开发中,这类界面用途很广。 下面我简单介绍一下设计思路。

首先我们要实现树型目录就要定义一个Tree的主干,也就是Tree类,然后在Tree上面安放节点(Node类)。每个节点下面就是分类的内容项目。 这样就是个二级树结构了。在实现上,我们把每个节点下包含的内容称作Member,让Member和Node都属于一种类型,我给它起名叫做Element。 我这样设计有它的一个好处,就是在界面上比较好表现出来,通过看代码就可以发现了。

下面是Element类的实现,我们把Element定义为抽象类。

package tree;

/**
*
@author K7sem
*/

public abstract class Element {
 
 
protected String label;
 
protected boolean selected = false;
 
 
public Element(String str) {
  label 
= str;
 }

 
 
public Element() {  
 }

 
 
public String getLabel() {
  
return label;
 }

 
 
public void setLabel(String s) {
  label 
= s;
 }


 
public boolean isSelected() {
  
return selected;
 }

 
 
public void setSelected(boolean b) {
  selected 
= b;
 }

}

 

Element类中有两个成员变量,分别表示一个元素的名称和选中的状态, 当然这只是我的假设,我们还可以更改Element类,让它具备更多的特性,前提是这些属性要被Node和Member共用。


下面是Member类的实现:

 


package tree;

/**
*
@author: k7sem
*/

public class Member extends Element{    
    
    
public Member(String s) {
        
super(s);
    }

    
}

 


Member类可以什么都没有吗? 当然可以,因为如果它不需要额外的特性,比如带一个图标。 那么它可是不增加任何成员,只要实现一个构造器,然后去掉用一下父类的构造就OK了。

下面是Node类的实现:

 

package tree;

import java.util.Vector;

/**
*
@author: k7sem
*/

public class Node extends Element{
    
    
private boolean expand = false;
    
private Vector members = new Vector();    
    
    
public Node(String s) {
        
super(s);
    }
    
    
    
public void addMember(Member m) {
        members.addElement(m);
    }

    
    
public void removeMember(Member m) {
        members.removeElement(m);
    }

    
    
public Vector getMembers() {
        
return members;
    }

    
    
public void setExpand(boolean b) {
        expand 
= b;
    }

    
    
public boolean isExpanded() {
        
return expand;
    }

}

 

Node类看起来比Member类稍微多了一些代码,expand表示这个界面展开和收起的状态,members是一个Vector类对象,用来存储在这个节点下的所有成员。 当然它需要实现一些必要的方法才能完善这些功能,比如addMember和removeMember。

好了,下面是我们的主角,Tree类的实现部分:

 

package tree;

import java.util.Vector;

/**
*
@author: k7sem
*/

public class Tree {    
    
    
private int maxSize = 0;
    
private Vector elements = new Vector();
    
private Vector displayList = new Vector();
    
private Vector dynamicList = null;    
    
private int beginIndex = 0;
    
private int endIndex = 0;
    
private int index = 0;        
    
private String name = null;    
    
private int uiIndex = 0;
    
    
public Tree(String n, int max) {
        name 
= n;
        maxSize 
= max;
    }

    
    
public Tree() {
        
    }
    
    
public void setName(String str) {
        name 
= str;
    }

    
    
public String getName() {
        
return name;
    }

    
    
public int getIndex() {
        
return index;
    }

    
/**
     * 添加节点
     * 
@param n
     
*/

    
public void addNode(Node n) {
                          elements.addElement(n);
        refreshList();
    }

    
    
/**
     * 删除节点
     * 
@param n
     
*/

    
public void removeNode(Node n) {
        elements.removeElement(n);
        refreshList();
    }


    
    
/**
     * 获得当前选中的元素
     * 
@return
     
*/

    
public Element getSelectedElement() {
        
if (dynamicList == null || index < 0 || index > dynamicList.size() - 1{
            
return null;
        }

        
return (Element) dynamicList.elementAt(index);
    }

    
    
/**
     * 设置对大显示数
     * 
@param i
     
*/

    
public void setDisplaySize(int i) {
        maxSize 
= i;
    }

    
    
// 得到最大显示数
    public int getDisplaySize() {
        
return maxSize;
    }

    
    
// 得到界面上用到的index

    
public int getUiIndex() {
        
return uiIndex;
    }

    
    
/**
     * 得到可显示的List
     * 
@return
     
*/

    
public Vector getDisplayElements() {
        
return displayList;
    }

    
    
/**
     * 移动在整个动态List中的index
     * 
@param over
     
*/

    
public void moveIndexUp(boolean over) {
        
if (over) {
            
if (beginIndex > 0{
                index
--;
                beginIndex
--;
                
if (beginIndex >= 0{
                    
if ((dynamicList.size() - beginIndex) <= maxSize) {
                        endIndex 
= dynamicList.size();                        
                    }
 else {
                        endIndex
--;
                    }

                }
 else {
                    endIndex
--;
                }

                refreshDisplayList();                
            }
            
            
        }
 else {
            index
--;
            moveUiIndexUp();
        }

        
    }
    
    
    
/**
     * 移动在整个动态List中的index
     * 
@param over
     
*/

    
public void moveIndexDown(boolean over) {
        
if (over) {            
            
if (endIndex < dynamicList.size()) {                
                index
++;
                endIndex
++;
                beginIndex
++;                
                refreshDisplayList();                
            }

            
        }
 else {
            index
++;
            moveUiIndexDown();
        }

    }

    
    
// 移动界面上的index
    private void moveUiIndexUp() {        
        uiIndex
--;        
    }

    
    
// 移动界面上的index
    private void moveUiIndexDown() {        
        uiIndex
++;        
    }

    
    
/*
     *更新可显示的List 
     
*/

    
private void refreshDisplayList() {
        displayList.removeAllElements();