extjs_TreePanel的使用

一直觉得短信平台中群发短信时通讯簿的选择号码方式不太好用,因此想找一个好用的 tree 控件。用过 dtree ,简单但功能不够强大(节点不能带 checkbox )。所以就试了下大名鼎鼎的 ext 库,其中的 treepanel 果然十分强大,完全满足我的需要:

 

1、  节点带 checkbox ,方便选择多个号码;

2、  当选择 / 反选父节点时,自动选择 / 反选其下的所有子节点;

3、  树的模型数据可以来自 json ,也可以来自 xml

4、  Ext 库对事件的支持十分全面,如特有的 checkchange 事件;

5、  跨浏览器支持,目前在 ie firefox 下都调试通过。

 

一、准备工作

1 、首先需要下载 ext 库,我目前使用的版本是 ext-2.2.1.zip ,解压缩后,我们需要的只是以下几个目录和文件:

Adaper/ext

Resource

ext-all.js

ext-all-debug.js

ext-core.js

ext-core-debug.js

在应用程序发布目录下建一个 extjs 目录,然后把上述内容拷贝至其中。

 

2 、另外,要正确解析 json ,我们还需要 org.json.jar 这个包。把它拷贝到 web-inf/lib 目录下。

 

3 、示例程序。在应用程序发布目录下建一个 tree 目录,把 tree.jsp treesample.jsp 放到其中。

 

二、在页面中引用 ext 库,并使用 treepanel 组件

打开 tree.jsp 页面,首先如果你不想看到菜单里的中文都变成一堆乱码的话,在

第一行加上:

<%@ page contentType="text/html; charset=gbk" %>

然后是导入 ext 库,注意 href 中的脚本位置,如果你的 ext 库所在位置跟本文不一样,请修改它,其中 ext-all-debug.js 在发布时可以改为 ext-all.js

<link rel="stylesheet" type="text/css" href="../extjs/resources/css/ext-all.css">

<script type="text/javascript" src="../extjs/adapter/ext/ext-base.js"></script>

<script type="text/javascript" src="../extjs/ext-all-debug.js"></script>

 

接下来是在脚本中生成 ext treepanel 组件:

Ext.BLANK_IMAGE_URL = '../extjs/resources/images/vista/s.gif'; // 选择模板 :vista

             var tree = null; 

             Ext.onReady(function(){ 

                 var Tree = Ext.tree; 

                  

                 tree = new Tree.TreePanel({ 

                     el:'tree-div',  // 树显示的位置 ,dom 元素的 id

                     autoScroll:true, 

                     animate:false, 

                     enableDD:false,  // 是否支持拖拽

                     containerScroll: true,  

                     loader: new Tree.TreeLoader({ 

                         dataUrl:'treesample.jsp' 

                     }) , 

                     rootVisible: false 

                 }); 

   注意其中红色字体部分, TreeLoader 通过 ajax 方式请求一个 url ,以获得树的 model Model 的数据类型可以是 json ,也可以是 xml 。本文采用 json 方式。

 

当然,为了达到更好的效果,还定义了一个 ext 事件,用于实现勾选 / 反选父节点时自动勾选 / 反选所有子节点:

tree.on('checkchange', function(node, checked) { 

                     node.expand(); 

                     node.attributes.checked = checked; 

                     node.eachChild(function(child) { 

                         child.ui.toggleCheck(checked); 

                         child.attributes.checked = checked; 

                         child.fireEvent('checkchange', child, checked); 

                     }); 

                 }, tree); 

                           

另外定义的两个 js 函数,一个实现打印选择的所有节点的 id 值,一个实现展开 / 折叠全部子节点,根据需要进行定义。

最后,需要在 body 中定义 tree 需要显示的位置:

<div id="tree-div" style="overflow:auto; height:300px;300px;border:1px solid c3daf9;"></div>

 

三、获取节点数据

Treepanel 需要的节点数据由 treesample.jsp 提供,大部分的代码集中在这里。其实也很简单,就是从数据库中 select 数据,然后通过 org.json.JSONArray org.json.JSONObject 对象构造一个 json 树组,具体内容看源代码。

 

 

 

 

杨宏焱 2009-12-4

 

详细源代码、ext库、jar包等都已经上传到资源 里。

原文地址:https://www.cnblogs.com/encounter/p/2188559.html