zTree联想终极篇-->将存储树形数据表封装成自定义TreeNode-->将自定义TreeNode解析成JSON树形字串
2011-11-28 16:02
661 查看
写了一个早上,终于实现,现在分享如下:
所有功能一个TreeNode完成,如下图:
TreeNode代码如下,你不要错过:)
我的测试代码如下:
JSP页面如何使用这个测试呢:
注意id为“treeDemo3"的代码
运行结果,如下图:
点击节点执行click事件弹出当前节点的编号,参考前面的代码如何实现:
大功告成!!!
所有功能一个TreeNode完成,如下图:
TreeNode代码如下,你不要错过:)
package model; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; /** 自定义的树节点 */ public class TreeNode { // 节点携带的值 private Map<String, Object> tag; // 儿子节点 private List<TreeNode> nodes; /** 节点信息键值对,该属性不会为空指针,但可能没有键值对存在[就是map.size()==0] */ public Map<String, Object> getTag() { if (tag == null) tag = new HashMap<String, Object>(); return tag; } public void setTag(Map<String, Object> tag) { this.tag = tag; } /** 获得所有子节点,该属性不会为空指针,但可能没有集合元素存在 */ public List<TreeNode> getNodes() { if (nodes == null) nodes = new ArrayList<TreeNode>(); return nodes; } public void setNodes(List<TreeNode> nodes) { this.nodes = nodes; } public TreeNode(Map<String, Object> tag, List<TreeNode> nodes) { super(); this.tag = tag; this.nodes = nodes; } public TreeNode() { super(); } public TreeNode(Map<String, Object> tag) { super(); this.tag = tag; } /** * <pre> * 将当前TreeNode解析为JSON字串 构造的目标格式示例: * { * id:1, * name:'手机', * nodes:[ * {id:11,name:'诺基亚'}, * {id:12,name:'三星',nodes:[ * {id:121,name:'I9000(联通版)'}, * {id:122,name:'I9000(移动版)'}, * {id:123,name:'Galaxy Naos'} * ]}, * {id:13,name:'索爱'} * ] * } * </pre> * */ private String toJson() { // if (this.getNodes().size() == 0) // throw new RuntimeException("节点不能没有任何属性"); return parseTreeNode(this); } /** * 将对象集合解析为json格式的树形脚本 * @param <E> 集合成员类型 * @param entities 待解析的集合,必须具备有效值 * @param key 对象的唯一标识属性,必须具备有效值 * @param parentKey 父对象的唯一标识属性,必须具备有效值 * @param fieldPropertyMap java对象属性名到json对象属性名的映射,比如java对象的属性名是code,对应解析后的json对象的属性名是id * @param parseCallBack 解析回调函数,用于扩展树节点的属性,有了这个接口给开发这个一个可以自定义树形节点特殊属性的机会 * @param parseFields 需要解析的字段,没有传递就解析对象的所有属性 * @return json格式的树形脚本 * 例如结果如下格式: * <pre> * [ * {id:11,name:'诺基亚'}, * {id:12,name:'三星',nodes:[ * {id:121,name:'I9000(联通版)'}, * {id:122,name:'I9000(移动版)'}, * {id:123,name:'Galaxy Naos'} * ]}, * {id:13,name:'索爱'}, * {id:14,name:'TCL'}, * {id:15,name:'摩托罗拉'} * ] * 使用示范如下: * * //用一个集合模拟数据表的内容,也就是一下集合的内容完全可以查询自数据库 * List<SysFunction> treeList = new ArrayList<SysFunction>(); * treeList.add(new SysFunction("L01", null, "营销管理","没有")); * treeList.add(new SysFunction("L02",null,"客户管理","没有")); * treeList.add(new SysFunction("L03",null,"服务管理","没有")); * //营销管理的子功能 * treeList.add(new SysFunction("L0101","L01","创建销售机会","没有")); * treeList.add(new SysFunction("L0102","L01","指派销售机会","没有")); * treeList.add(new SysFunction("L0103","L01","制定开发计划","没有")); * treeList.add(new SysFunction("L0104","L01","执行开发计划","没有")); * //指派销售机会的子功能 * treeList.add(new SysFunction("L010201","L0102","经理指派","没有")); * treeList.add(new SysFunction("L010202","L0102","主管指派","没有")); * //客户管理的子功能 * treeList.add(new SysFunction("L0201","L02","客户信息管理","没有")); * treeList.add(new SysFunction("L0202","L02","客户流失管理","没有")); * //服务管理子功能 * treeList.add(new SysFunction("L0301","L03","咨询服务管理","没有")); * treeList.add(new SysFunction("L0302","L03","投诉服务管理","没有")); * treeList.add(new SysFunction("L0303","L03","查询服务管理","没有")); * * try { * Properties p = new Properties(); * p.setProperty("code", "id");//将SysFunction对象里的属性名“code”映射到json对象里的属性名“id” * p.setProperty("title", "name");//将SysFunction对象里的属性名“title”映射到json对象里的属性名“name” * * //开始调用解析函数,第五个参数是一个匿名内部类 * return * TreeNode.parseListToJsonTree( * treeList, * "code", * "parentCode", * p, * new TreeNode.IParseTreeNodeCallBack() { * public void processTreeNode(TreeNode node) { * node.getTag().put("open",true);//向节点追加一个属性,表示要zTree展开这个节点 * node.getTag().put("click","alert('"+node.getTag().get("id")+"')");//向节点追加一个属性click,表示要求zTree的节点具有响应点击事件的能力 * } * }, * "code", //java对象SysFunction里要code属性参与解析 * "parentCode", //java对象SysFunction里要parentCode属性参与解析 * "title" //java对象SysFunction里要title属性参与解析 * ); * } catch (Exception e) { * e.printStackTrace(); * } * </pre> * @throws SecurityException java反射异常 * @throws NoSuchFieldException java反射异常 * @throws IllegalArgumentException java反射异常 * @throws IllegalAccessException java反射异常 */ public static <E> String parseListToJsonTree(List<E> entities, String key, String parentKey, Properties fieldPropertyMap,IParseTreeNodeCallBack parseCallBack,String...parseFields) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { if (entities==null || entities.size()==0 || null==key || "".equals(key) || null==parentKey || "".equals(parentKey)) throw new RuntimeException("参数不是有效值,分析失败"); if (fieldPropertyMap==null) fieldPropertyMap = new Properties(); List<TreeNode> nodes = new ArrayList<TreeNode>(); //将这个集合封装成Map Map<String,TreeNode> treeNodeMap = new HashMap<String,TreeNode>(); Class classzz = entities.get(0).getClass(); Field keyField = classzz.getDeclaredField(key); Field parentKeyField = classzz.getDeclaredField(parentKey); keyField.setAccessible(true);//设置可以访问私有字段 parentKeyField.setAccessible(true);//设置可以访问私有字段 String keyJsonPropertyName = "";//key的json属性 String parentKeyJsonPropertyName="";//parentKey的json属性 //处理key if (fieldPropertyMap.containsKey(key))//如果包含对key的名称映射 keyJsonPropertyName = fieldPropertyMap.getProperty(key);//如果包含key映射就用映射名字作json对象属性名 else keyJsonPropertyName = keyField.getName();//如果不包含key映射就用字段名作json对象属性名 //同上处理parentKey if (fieldPropertyMap.containsKey(parentKey))//如果包含对key的名称映射 parentKeyJsonPropertyName = fieldPropertyMap.getProperty(parentKey); else parentKeyJsonPropertyName = parentKeyField.getName(); //下面的循环完成两个功能: // 1.将所有对象封装成Map里面的键值对,且值是TreeNode类型 // //2.将没有父节点的TreeNode添加到根节点rootNode for(E e:entities){ TreeNode node = new TreeNode(); //处理关键属性 //处理key node.getTag().put(keyJsonPropertyName, keyField.get(e)); //同上处理parentKey node.getTag().put(parentKeyJsonPropertyName,parentKeyField.get(e)); //处理其它属性 if (parseFields==null || parseFields.length==0){ for(Field field: classzz.getDeclaredFields()){ field.setAccessible(true);//设置可以访问私有字段 if (fieldPropertyMap.containsKey(field.getName()))//如果map中包含名字映射 node.getTag().put(fieldPropertyMap.getProperty(field.getName()), field.get(e)); else node.getTag().put(field.getName(),field.get(e));//不包含名字映射则使用字段本身的名字作json对象属性 } } else { for(String fieldName: parseFields){ Field field = classzz.getDeclaredField(fieldName); field.setAccessible(true);//设置可以访问私有字段 if (fieldPropertyMap.containsKey(field.getName()))//如果map中包含名字映射 node.getTag().put(fieldPropertyMap.getProperty(field.getName()), field.get(e)); else node.getTag().put(field.getName(),field.get(e));//不包含名字映射则使用字段本身的名字作json对象属性 } } if (parseCallBack!=null)//判断回调是否为空 parseCallBack.processTreeNode(node);//回调 treeNodeMap.put(keyField.get(e).toString(),node); } //下面的代码建立节点之间的从属关系 for(int i=0;i<entities.size();i++){ E e = entities.get(i); if (treeNodeMap.containsKey(parentKeyField.get(e))){//如果当前功能的父级功能编号在treeNodeMap中存在 treeNodeMap .get(parentKeyField.get(e))//找出父节点 .getNodes() //父节点的子节点集合 .add( //向子节点集合添加子节点 treeNodeMap.get(keyField.get(e))//找出子节点 ); continue; } //如果当期节点没有父亲节点则说明是根节点 nodes.add(treeNodeMap.get(keyField.get(e))); } //生成JSON字串 StringBuilder jsonBuilder = new StringBuilder("["); for (TreeNode treeNode : nodes) { jsonBuilder.append(treeNode.toJson()+","); } if (jsonBuilder.charAt(jsonBuilder.length()-1)==',') jsonBuilder.deleteCharAt(jsonBuilder.length()-1); jsonBuilder.append("]"); return jsonBuilder.toString(); } /** * 将对象集合解析为json格式的树形脚本 * @param <E> 集合成员类型 * @param entities 待解析的集合,必须具备有效值 * @param key 对象的唯一标识属性,必须具备有效值 * @param parentKey 父对象的唯一标识属性,必须具备有效值 * @param fieldPropertyMap java对象属性名到json对象属性名的映射,比如java对象的属性名是code,对应解析后的json对象的属性名是id * @return json格式的树形脚本 * 例如结果如下格式: * <pre> * [ * {id:11,name:'诺基亚'}, * {id:12,name:'三星',nodes:[ * {id:121,name:'I9000(联通版)'}, * {id:122,name:'I9000(移动版)'}, * {id:123,name:'Galaxy Naos'} * ]}, * {id:13,name:'索爱'}, * {id:14,name:'TCL'}, * {id:15,name:'摩托罗拉'} * ] * 使用示范如下: * * //用一个集合模拟数据表的内容,也就是一下集合的内容完全可以查询自数据库 * List<SysFunction> treeList = new ArrayList<SysFunction>(); * treeList.add(new SysFunction("L01", null, "营销管理","没有")); * treeList.add(new SysFunction("L02",null,"客户管理","没有")); * treeList.add(new SysFunction("L03",null,"服务管理","没有")); * //营销管理的子功能 * treeList.add(new SysFunction("L0101","L01","创建销售机会","没有")); * treeList.add(new SysFunction("L0102","L01","指派销售机会","没有")); * treeList.add(new SysFunction("L0103","L01","制定开发计划","没有")); * treeList.add(new SysFunction("L0104","L01","执行开发计划","没有")); * //指派销售机会的子功能 * treeList.add(new SysFunction("L010201","L0102","经理指派","没有")); * treeList.add(new SysFunction("L010202","L0102","主管指派","没有")); * //客户管理的子功能 * treeList.add(new SysFunction("L0201","L02","客户信息管理","没有")); * treeList.add(new SysFunction("L0202","L02","客户流失管理","没有")); * //服务管理子功能 * treeList.add(new SysFunction("L0301","L03","咨询服务管理","没有")); * treeList.add(new SysFunction("L0302","L03","投诉服务管理","没有")); * treeList.add(new SysFunction("L0303","L03","查询服务管理","没有")); * * try { * Properties p = new Properties(); * p.setProperty("code", "id");//将SysFunction对象里的属性名“code”映射到json对象里的属性名“id” * p.setProperty("title", "name");//将SysFunction对象里的属性名“title”映射到json对象里的属性名“name” * * //开始调用解析函数 * return * TreeNode.parseListToJsonTree(treeList, "code","parentCode",p); * } catch (Exception e) { * e.printStackTrace(); * } * </pre> * @throws SecurityException java反射异常 * @throws NoSuchFieldException java反射异常 * @throws IllegalArgumentException java反射异常 * @throws IllegalAccessException java反射异常 */ public static <E> String parseListToJsonTree(List<E> entities, String key, String parentKey, Properties fieldPropertyMap) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { return parseListToJsonTree(entities,key,parentKey,fieldPropertyMap,null); } /** * 将对象集合解析为json格式的树形脚本 * @param <E> 集合成员类型 * @param entities 待解析的集合,必须具备有效值 * @param key 对象的唯一标识属性,必须具备有效值 * @param parentKey 父对象的唯一标识属性,必须具备有效值 * @return json格式的树形脚本 * 例如结果如下格式: * <pre> * [ * {id:11,name:'诺基亚'}, * {id:12,name:'三星',nodes:[ * {id:121,name:'I9000(联通版)'}, * {id:122,name:'I9000(移动版)'}, * {id:123,name:'Galaxy Naos'} * ]}, * {id:13,name:'索爱'}, * {id:14,name:'TCL'}, * {id:15,name:'摩托罗拉'} * ] * 使用示范如下: * * //用一个集合模拟数据表的内容,也就是一下集合的内容完全可以查询自数据库 * List<SysFunction> treeList = new ArrayList<SysFunction>(); * treeList.add(new SysFunction("L01", null, "营销管理","没有")); * treeList.add(new SysFunction("L02",null,"客户管理","没有")); * treeList.add(new SysFunction("L03",null,"服务管理","没有")); * //营销管理的子功能 * treeList.add(new SysFunction("L0101","L01","创建销售机会","没有")); * treeList.add(new SysFunction("L0102","L01","指派销售机会","没有")); * treeList.add(new SysFunction("L0103","L01","制定开发计划","没有")); * treeList.add(new SysFunction("L0104","L01","执行开发计划","没有")); * //指派销售机会的子功能 * treeList.add(new SysFunction("L010201","L0102","经理指派","没有")); * treeList.add(new SysFunction("L010202","L0102","主管指派","没有")); * //客户管理的子功能 * treeList.add(new SysFunction("L0201","L02","客户信息管理","没有")); * treeList.add(new SysFunction("L0202","L02","客户流失管理","没有")); * //服务管理子功能 * treeList.add(new SysFunction("L0301","L03","咨询服务管理","没有")); * treeList.add(new SysFunction("L0302","L03","投诉服务管理","没有")); * treeList.add(new SysFunction("L0303","L03","查询服务管理","没有")); * * try { * //开始调用解析函数 * return * TreeNode.parseListToJsonTree(treeList, "code","parentCode"); * } catch (Exception e) { * e.printStackTrace(); * } * </pre> * @throws SecurityException java反射异常 * @throws NoSuchFieldException java反射异常 * @throws IllegalArgumentException java反射异常 * @throws IllegalAccessException java反射异常 */ public static <E> String parseListToJsonTree(List<E> entities, String key, String parentKey) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { return parseListToJsonTree(entities,key,parentKey,null,null); } /** * <pre> * 将当前TreeNode解析为JSON字串 构造的目标格式示例: * { * id:1, * name:'手机', * nodes:[ * {id:11,name:'诺基亚'}, * {id:12,name:'三星',nodes:[ * {id:121,name:'I9000(联通版)'}, * {id:122,name:'I9000(移动版)'}, * {id:123,name:'Galaxy Naos'} * ]}, * {id:13,name:'索爱'} * ] * } * </pre> * */ private String parseTreeNode(TreeNode node) { if (node == null) throw new RuntimeException("节点不能为空"); StringBuilder nodeBuilder = new StringBuilder("{");// JSON对象开始 // 把Map中的键值对构造成json对象属性 for (Map.Entry<String, Object> kvp : node.getTag().entrySet()) { if (kvp.getValue()==null || kvp.getValue().getClass() == String.class) nodeBuilder.append(kvp.getKey() + ":\"" + kvp.getValue() + "\","); else nodeBuilder.append(kvp.getKey() + ":" + kvp.getValue() + ","); } // 构造子节点 nodeBuilder.append("nodes:["); // 子节点开始 for (TreeNode cnode : node.getNodes()) { if (cnode == null) continue; nodeBuilder.append(parseTreeNode(cnode) + ",");// 递归调用ParseTreeNode返回一个完整的JSON字串:"{属性1:value,属性2:value}" } if (nodeBuilder.charAt(nodeBuilder.length() - 1) == ',')// 去掉末尾逗号 nodeBuilder.deleteCharAt(nodeBuilder.length() - 1); nodeBuilder.append("]"); // 子节点结束 nodeBuilder.append("}"); // JSON对象结束 return nodeBuilder.toString(); } /** * 向指定节点及其子孙节点添加一个属性 * * @author jiang * @param node * 被放置属性的节点 * @param isrecursive * 是否递归[当前节点的子孙节点]放置属性 * @param entries * 放置的属性键值对 */ private void _putProperty(TreeNode node, Boolean isrecursive, Map.Entry<String, Object>... entries) { if (entries != null) for (Map.Entry<String, Object> entry : entries) { node.getTag().put(entry.getKey(), entry.getValue()); } if (!isrecursive) return; for (TreeNode n : node.getNodes()) { _putProperty(n, isrecursive, entries); } } /** * 向指定节点及其子孙节点添加一个属性 * * @author jiang * @param node * 被放置属性的节点 * @param isrecursive * 是否递归[当前节点的子孙节点]放置属性 * @param entries * 放置的属性键值对 */ public void putProperty(Boolean isrecursive, Map.Entry<String, Object>... entries) { _putProperty(this, isrecursive, entries); } public interface IParseTreeNodeCallBack{ void processTreeNode(TreeNode node); } }
我的测试代码如下:
package biz; import java.util.ArrayList; import java.util.List; import java.util.Properties; import model.TreeNode; /** * 系统功能对象 * */ class SysFunction { private String code; private String parentCode; private String title; private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } /**功能编号*/ public String getCode() { return code; } public void setCode(String code) { this.code = code; } /**父级功能编号*/ public String getParentCode() { return parentCode; } public void setParentCode(String parentCode) { this.parentCode = parentCode; } /**功能名称,现在树上的节点文本*/ public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public SysFunction(String code, String parentCode, String title) { super(); this.code = code; this.parentCode = parentCode; this.title = title; } public SysFunction(String code, String parentCode, String title,String desc) { super(); this.code = code; this.parentCode = parentCode; this.title = title; this.desc = desc; } public SysFunction() { super(); } } public class TreeNodeService { public String getTree(){ //这里用一个集合模拟数据表的内容,也就是一下集合的内容完全可以查询自数据库 //存储树形的数据表应该满足以下基本机构: /*CREATE TABLE JTREE ( CODE INT PRIMARY KEY,//当前节点的ID,这个是必须字段,名字无所谓 PARENT_CODE INT REFERENCES JTREE(CODE),//当前节点的父节点ID,这个是必须字段,且必须符合父子引用关系,名字无所谓 TITLE VARCHAR2(32),//节点显示的文本 ...,//节点其它信息 ...//节点其它信息 );*/ List<SysFunction> treeList = new ArrayList<SysFunction>(); treeList.add(new SysFunction("L01", null, "营销管理","没有")); treeList.add(new SysFunction("L02",null,"客户管理","没有")); treeList.add(new SysFunction("L03",null,"服务管理","没有")); //营销管理的子功能 treeList.add(new SysFunction("L0101","L01","创建销售机会","没有")); treeList.add(new SysFunction("L0102","L01","指派销售机会","没有")); treeList.add(new SysFunction("L0103","L01","制定开发计划","没有")); treeList.add(new SysFunction("L0104","L01","执行开发计划","没有")); //指派销售机会的子功能 treeList.add(new SysFunction("L010201","L0102","经理指派","没有")); treeList.add(new SysFunction("L010202","L0102","主管指派","没有")); //客户管理的子功能 treeList.add(new SysFunction("L0201","L02","客户信息管理","没有")); treeList.add(new SysFunction("L0202","L02","客户流失管理","没有")); //服务管理子功能 treeList.add(new SysFunction("L0301","L03","咨询服务管理","没有")); treeList.add(new SysFunction("L0302","L03","投诉服务管理","没有")); treeList.add(new SysFunction("L0303","L03","查询服务管理","没有")); try { Properties p = new Properties(); p.setProperty("code", "id");//将SysFunction对象里的属性名“code”映射到json对象里的属性名“id” p.setProperty("title", "name");//将SysFunction对象里的属性名“title”映射到json对象里的属性名“name” //开始调用解析函数,第五个参数是一个匿名内部类 return TreeNode.parseListToJsonTree(treeList, "code","parentCode",p,new TreeNode.IParseTreeNodeCallBack() { public void processTreeNode(TreeNode node) { node.getTag().put("open",true);//向节点追加一个属性,表示要zTree展开这个节点 node.getTag().put("click","alert('"+node.getTag().get("id")+"')");//向节点追加一个属性click,表示要求zTree的节点具有响应点击事件的能力 } }); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "[]"; } }
JSP页面如何使用这个测试呢:
注意id为“treeDemo3"的代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="biz.TreeNodeService"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="demoStyle/demo.css" type="text/css"></link> <link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="jquery-1.4.2.js"></script> <script type="text/javascript" src="jquery.ztree-2.6.js"></script> <script type="text/javascript" src="asyncData/demoData.js"></script> <script type="text/javascript"> var setting1 = {showline:true,checkable:true}; //json var zTreeNodes1 = [ { "name":"google", "url":"http://g.cn", "target":"_blank"}, { "name":"baidu", "url":"http://baidu.com", "target":"_blank"}, { "name":"sina", "url":"http://www.sina.com.cn", "target":"_blank"} ]; var zTreeNodes2 = [ {id:1,name:'手机',nodes:[ {id:11,name:'诺基亚',nodes:[ {id:111,name:'C6(音乐版)'}, {id:112,name:'X6(导航版)'}, {id:113,name:'5230(世博版)'} ]}, {id:12,name:'三星'}, {id:13,name:'索爱'}, {id:14,name:'多普达'} ]}, {id:2,name:'电脑'}, {id:3,name:'家电'} ]; window.onload=function(){ $("#treeDemo1").zTree(setting1,zTreeNodes1); $("#treeDemo2").zTree({showline:true,checkable:false},zTreeNodes2); $("#treeDemo3").zTree({showline:true,checkable:true},<%=new TreeNodeService().getTree() %>); }; </script> </head> <body> <div class="zTreeDemoBackground" style="float:left;"> <ul id="treeDemo1" class="tree" style="float:left;"></ul> </div> <div class="zTreeDemoBackground" style="float:left;"> <ul id="treeDemo2" class="tree"></ul> </div> <div class="zTreeDemoBackground" style="float:left;"> <ul id="treeDemo3" class="tree"></ul> </div> </body> </html>
运行结果,如下图:
点击节点执行click事件弹出当前节点的编号,参考前面的代码如何实现:
TreeNode.parseListToJsonTree(treeList, "code","parentCode",p,new TreeNode.IParseTreeNodeCallBack() { public void processTreeNode(TreeNode node) { node.getTag().put("open",true);//向节点追加一个属性,表示要zTree展开这个节点 node.getTag().put("click","alert('"+node.getTag().get("id")+"')");//向节点追加一个属性click,表示要求zTree的节点具有响应点击事件的能力 } });
大功告成!!!
相关文章推荐
- zTree的联想[将数据表封装成自定义TreeNode,再将TreeNode生成json字串
- 学习笔记 Tianmao 篇 使用简单封装后的自定义OkHttp 获取json被GSON解析后的数据
- 使用万能表单解析程序将表单数据封装成List<Map>
- 【COCOS2D-X(1.X 2.X) Json(cpp版)及新加字体库篇】在Cocos2dx引擎中封装、解析Json(cpp版)数据以及添加自定义字体库 .
- FreeMarker解析List<JSONObject>数据的疑惑
- 【Qt编程】基于Qt的词典开发系列<九>--JSON数据解析
- 【COCOS2D-X(1.X 2.X) Json(cpp版)及新加字体库篇】在Cocos2dx引擎中封装、解析Json(cpp版)数据以及添加自定义字体库
- Gson解析json字符串,并封装成List<T>
- 23>IOS数据解析---------之JSON和XML解析
- NSJSONSerialization解析JSON数据 ----JSON->NSData/NSData->JSON
- asp.net ajax解析json数据(运用List<Hashtable>装数据)
- Json解析简单数据<二>
- IOS-----> Json数据解析
- JSON解析之实战演练-->解析购物网站数据
- json解析简单数据<一>
- <转>android 解析json数据格式
- Android数据存储——2.文件存储_F_解析JSON文档
- ios解析xml的两种方法,NSXMLParser和第三方库GDataXMLNode还有json数据的解析
- JSONArray 将数组格式的json数据 需要的包 <dependency>
- iOS网络开发——解析与封装JSON数据