一个JTree的Model

自从去年的JTree后,这一段时间对JTree又研究了一下。这次的方向是树的数据模型的生成。能够创建一个较为通用的树模型。

 

package  commonUtil;

import  java.util.ArrayList;
import  java.util.HashMap;
import  java.util.List;
import  java.util.Map;

import  javax.swing.tree.DefaultMutableTreeNode;

public   class  TreeNode  {

    
/**
     * 解析编码规则,例如:2-2-2<p>
     * 
@param String 2-2-2
     * 
@return int[] { 2,4,6 }
     * 
*/

    
public static int[] getRule(String rule) {
        String[] strRule 
= rule.split("-");
        
int[] intRule = new int[strRule.length];
        
forint i = 0 ; i < strRule.length ; i++ ) {
            
if( i == 0 )
                intRule[i] 
= Integer.parseInt(strRule[i]);
            
else
                intRule[i] 
= intRule[i - 1+ Integer.parseInt(strRule[i]);
        }

        
return intRule;
    }

    
    
/**
     * 获取父级Code<p>
     * 
@param code 子接口点code 如:01、11
     * 
@param int[] intNode 解析后的编码规则数组
     * 
@return 父节点code 如:01、12
     * 
*/

    
public static String getFatherCode(String code,int[] intNode) {
        
//int[] intNode = getRule(rule);
        int codeSize = code.length();
        
//一级节点没有父节点,因此i从1开始
        forint i = 1 ; i < intNode.length ; i++ ) {
            
if( intNode[i] == codeSize ) {
                
return code.substring( 0 , codeSize - (intNode[i] - intNode[i - 1]));
            }

        }

        
return "";
    }

    
    
/**
     * 构建树节点信息,方便主方法生成树的时候调用<p>
     * 
@param treeList 传入的数据列表,其中每个单元都是HashMap对象,
     *                  对象中都有name和code的对象。
     * 
@param rule 传入构建树的规则,如"2-2-2"
     * 
@return 返回构建好的树节点信息
     * 
*/

    
public static Map createTreeNodeInfo(List treeList,String rule){
        
        
//初始化编码规则
        if( isNull(rule) == true )
            rule 
= "2-2-2";
        
//获得解析后的编码规则
        int[] intNode = getRule(rule);
        
//队列大小
        int treeSize = treeList.size();
        
        
//数据
        Map data = new HashMap();
        List list 
= new ArrayList();
        String code 
= "";
        String codeName 
= "";
        String fatherCode 
= "";
        
//node哈希表
        Map node = new HashMap();
        
        
forint i = 0 ; i < treeSize ; i++ ){
            data 
= new HashMap();
            data 
= (Map)treeList.get(i);
            list 
= new ArrayList();
            
//数据名称
            codeName = (String)data.get("name");
            
//数据code
            code = (String)data.get("code");
            
//父级code
            fatherCode = getFatherCode(code,intNode);
            
            list.add(code);
            list.add(codeName);
            list.add(fatherCode);  
            node.put(code,list);
        }

        
        
return node;
    }

    
    
/**
     * 创建辅助录入树的数据模型,这个方法是对外使用的主方法。创建树调用此方法即可<p>
     * 
@param treeList 传入的数据列表,其中每个单元都是HashMap对象,
     *                  对象中都有name和code的对象。
     * 
@param rule 传入构建树的规则,如"2-2-2"
     * 
@return DefaultMutableTreeNode 返回树模型
     * 
*/

    
public static DefaultMutableTreeNode createTreeNode(List treeList,String rule){
        
//创建根节点
        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("我的树");
        
//根据传入的数据列表,生成节点数据,为生成树做准备
        Map node = createTreeNodeInfo(treeList,rule);
        
//读取数据列表的大小
        int listSize = treeList.size();
        
//创建树节点,并初始化
        DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode();
        
//创建树节点哈希表,存放树节点数据
        Map treeNodes = new HashMap();
        
//list循环使用节点
        List list = new ArrayList();
        
//创建Map对象,为数据列表中每一条数据使用
        Map data = new HashMap();
        
//节点编码、节点名称、节点父级编码
        String[] code = new String[listSize];
        String[] codeName 
= new String[listSize];
        String[] fatherCode 
= new String[listSize];
        
        
//循环生成树节点
        forint i = 0 ; i < listSize ; i++ ) {
            data 
= new HashMap();
            data 
= (Map)treeList.get(i);
            list 
= (List)node.get(data.get("code"));
            code[i] 
= (String)list.get(0);
            codeName[i] 
= (String)list.get(1);
            fatherCode[i] 
= (String)list.get(2);
            treeNodes.put(code[i],
new DefaultMutableTreeNode(code[i] + " " + codeName[i]));
        }

        
        
//根据父子关系,生成完整的树
        forint i = 0 ; i < listSize ; i++ ) {
            treeNode 
= (DefaultMutableTreeNode)treeNodes.get(code[i]);
            
if( isNull(fatherCode[i]) == true ) {
                rootNode.add(treeNode);
            }
 else {
                ((DefaultMutableTreeNode)treeNodes.get(fatherCode[i])).add(treeNode);
            }
            
        }

        
        
return rootNode;
    }

    
    
/**
     * 验证传入的对象是否为空
     * 
@param obj 传入Object对象
     * 
@return true 是空值 false 不是空值
     * 
*/

    
public static boolean isNull(Object obj) {
        
if(obj == null)
            
return true;
        
else if("".equals(obj) == true)
            
return true;
        
else if("null".equals(obj) == true)
            
return true;
        
return false;
    }

}

 下面是调用方法:

 

JTree tree  =   new  JTree();
List list 
=  service.getList();
String strRule 
=   " 2-2-2 " ;
tree.setModel(
new  DefaultTreeModel(TreeNode.createTreeNode(list,strRule)));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值