1.簡單的樹
效果圖

代碼
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
-
- collapsible: true,
- title: '標(biāo)題',
- width: 200,
- border : false,
- autoScroll: true,
- animate : true,
- rootVisible: true,
- split: true,
- tbar:[{
- text:'展開',
- handler:function(){
- tree.expandAll();
- }
- },'-',{
- text:'折疊',
- handler:function(){
- tree.collapseAll();
- tree.root.expand();
- }
- }],
- listeners: {
- click: function(node) {
-
- Ext.Msg.alert('消息', '你點(diǎn)擊了: "' + node.attributes.text+"'");
- }
- }
- });
- var root = new Ext.tree.TreeNode({text:'我是根'});
- var root_node1 = new Ext.tree.TreeNode({text:'我是根的1枝'});
- var root_node2 = new Ext.tree.TreeNode({text:'我是根的2枝'});
-
- root.appendChild(root_node1);
- root.appendChild(root_node2);
-
- tree.setRootNode(root);
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
2.使用TreeLoader獲得后臺數(shù)據(jù)
- 每個節(jié)點(diǎn)最后一級必須是葉子節(jié)點(diǎn),否則會出現(xiàn)無限循環(huán)
- TreeNode并不支持Ajax,需要把根節(jié)點(diǎn)換成AsyncTreeNode實現(xiàn)異步加載效果
list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
index.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: 'TreeLoader獲得后臺數(shù)據(jù)',
- width: 200,
- border : false,
- autoScroll: true,
- animate : true,
- rootVisible: false,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root: new Ext.tree.AsyncTreeNode({
-
- expanded:false,
- text:'根節(jié)點(diǎn)'
- }),
- listeners: {
- afterrender: function(node) {
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
3.讀取本地JSON數(shù)據(jù)
- 因為有的樹形的數(shù)據(jù)并不多,為了獲得如此少量的數(shù)據(jù)而使用Ajax訪問后臺不劃算,
- 如果退回到每個節(jié)點(diǎn)都使用new來生成,又實在太麻煩,
- 那么能不能讓TreeLoader讀取本地的JavaScript中的JSON數(shù)據(jù),然后生成需要的樹節(jié)點(diǎn)呢
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
-
- collapsible: true,
- title: '標(biāo)題',
- width: 200,
- border : false,
- autoScroll: true,
- animate : true,
- rootVisible: false,
- split: true,
- loader : new Ext.tree.TreeLoader(),
- root : new Ext.tree.AsyncTreeNode({
- text:'我是根',
- children:[{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
- }),
- listeners: {
- afterrender: function(node) {
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
4.使用JSP提供后臺數(shù)據(jù)
- 樹形異步讀取的關(guān)鍵是node參數(shù),當(dāng)某一個節(jié)點(diǎn)展開時,treeLoader會根據(jù)設(shè)置的dataUrl去后臺讀取數(shù)據(jù),
- 而發(fā)送請求時,treeLoader會把這個節(jié)點(diǎn)的Id作為參數(shù)一起發(fā)送到后臺,對于后臺來說,只要獲取node參數(shù),
- 就知道是哪個節(jié)點(diǎn)正在執(zhí)行展開,
- 如果返回的子節(jié)點(diǎn)數(shù)據(jù)包含leaf:true屬性,AsyncTreeNode就會生成TreeNode節(jié)點(diǎn),并標(biāo)記為葉子
list.jsp
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
-
- String node = request.getParameter("node");
- System.out.println("node="+node);
- String json =
- "["+
- "{id:1,text:'01',"+
- "children:["+
- "{id:11,text:'01-01',leaf:true},"+
- "{id:12,text:'01-02',leaf:true}"+
- "]}"+
- ",{id:2,text:'02',"+
- "children:["+
- "{id:21,text:'02-01',leaf:true},"+
- "{id:22,text:'02-02',leaf:true}"+
- "]}"+
- "]";
- response.getWriter().write(json);
- %>
index.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: '標(biāo)題',
- width: 200,
- border : false,
- autoScroll: true,
- animate : true,
- rootVisible: false,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.jsp'
- }),
- root : new Ext.tree.AsyncTreeNode({
-
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
5.樹的事件
- listeners: {
- click: function(node) {
- Ext.Msg.alert('消息', '你點(diǎn)擊了: "' + node.attributes.text);
-
- },
- dblclick:function(node){
- alert('你雙擊了'+node);
- },
- expandnode:function(node){
- alert(node+'展開了'+node.attributes.text);
- },
- collapsenode:function(node){
- alert(node+'折疊了'+node.attributes.text);
- }
- }
6.右邊菜單
效果圖

list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
index.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var node_id;
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: '右鍵菜單',
- width: 200,
- border : false,
- animate : true,
- rootVisible: false,
- autoScroll: true,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root: new Ext.tree.AsyncTreeNode({
-
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- }
- });
- var cc = new Ext.menu.Menu({
- items :[{
- text: '增加',
- handler : function(){
- alert(node_id.attributes.text);
- cc.hide();
- }
- },{
- text: '刪除',
- handler : function(){
- alert('刪除');
- }
- },{
- text: '修改',
- handler : function(){
- alert('修改');
- }
- }]
- });
- tree.on('contextmenu',function(node,e){
- e.preventDefault();
- node.select();
-
- var array = e.getXY();
- cc.showAt(array);
- node_id = node;
- });
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
7.給樹節(jié)點(diǎn)設(shè)置圖片和超鏈接
list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true , icon : 'image/qq.jpg' },
- { text : '01-02' , leaf : true , href : 'http://www.baidu.com' }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
8.修改樹節(jié)點(diǎn)的標(biāo)題
list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
index.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: '修改節(jié)點(diǎn)標(biāo)題',
- width: 200,
- border : false,
- animate : true,
- rootVisible: false,
- autoScroll: true,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root: new Ext.tree.AsyncTreeNode({
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- }
- });
-
-
- var treeEditor = new Ext.tree.TreeEditor(tree,new Ext.form.TextField({
- allowBlank : false
- }));
-
-
-
-
-
-
- treeEditor.on('beforestartedit',function(editor,element,value){
- var treeNode = editor.editNode;
- var boolean = treeNode.isLeaf();
- return boolean;
- });
-
-
-
-
-
-
- treeEditor.on('complete',function(editor,value,startValue){
- alert('將要設(shè)置的值: '+editor.editNode.text+' 原來的值: '+startValue+" 改變后的值: "+value)
- });
-
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
9.樹的拖放
- 如果讓樹節(jié)點(diǎn)可以自由拖放,創(chuàng)建TreePanel時設(shè)置enableDD:true即可
- 不過直接設(shè)置只能實現(xiàn)葉子與枝干和根之間的拖放,葉子不能拖放到葉子下
list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
inde.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: '樹的拖動',
- width: 200,
- border : false,
- animate : true,
- rootVisible: false,
- autoScroll: true,
- split: true,
- enableDD : true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root: new Ext.tree.AsyncTreeNode({
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
9.1 節(jié)點(diǎn)拖放的三種形式
- append 放下去節(jié)點(diǎn)會變成被砸中節(jié)點(diǎn)的子節(jié)點(diǎn),形成父子關(guān)系,綠色加號標(biāo)志
- above 放下的節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)是兄弟關(guān)系,放下去的節(jié)點(diǎn)排列在前,一個箭頭兩個短橫線
- below 放下的節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)是兄弟關(guān)系,放下去的節(jié)點(diǎn)排列在后,兩個短橫線一個箭頭
9.2葉子不能append
- tree.on('nodedragover',function(e){
-
- var node = e.target;
- if(node.leaf){
- n.leaf = false;
- }
- return true;
- });
9.3 判斷拖放的目標(biāo)
- tree.on('nodedrop',function(e){
- Ext.Msg.alert('消息','我們的節(jié)點(diǎn) '+e.dropNode+' 掉到了 '+e.target+' 上,掉落方式是 '+ e.point);
- });
10.樹的過濾器Ext.tree.TreeFilter
list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true },
- { text : '01-02' , leaf : true }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true },
- { text : '02-02' , leaf : true }
- ]
- }]
index.jsp
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: 'tree過濾器',
- width: 400,
- border : false,
- animate : true,
- rootVisible: false,
- autoScroll: true,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root : new Ext.tree.AsyncTreeNode({
-
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- },
- tbar:[{
- text:'顯示02',
- handler:function(){
- treeFiler.filter('02');
- }
- },'-',{
- text:'顯示全部',
- handler:function(){
- treeFiler.clear();
- }
- },'-',{
- xtype : 'textfield',
-
- enableKeyEvents : true,
- listeners : {
-
- keyup : function(e){
- var t = this.getValue()
-
-
- var es = Ext.escapeRe(t);
- var re = new RegExp(es,'i');
-
- treeFiler.filterBy(function(n){
- return !n.isLeaf() || re.test(n.text);
- });
-
- hiddenPkgs =[];
-
- tree.root.cascade(function(n){
-
- if(!n.isLeaf()&&n.ui.ctNode.offsetHeight<3){
- n.ui.hide();
- hiddenPkgs.push(n);
- }
- });
- }
- }
- }]
- });
- var treeFiler = new Ext.tree.TreeFilter(tree,{
- clearBlank : true,
-
- autoClear : true
- });
-
- new Ext.Viewport({
- items: [tree]
- });
- });
- </script>
11.利用TreeSorter對樹進(jìn)行排序
- TreeSorter是一個專門用來對樹節(jié)點(diǎn)進(jìn)行排序的工具
- caseSensitive 區(qū)分大小寫,默認(rèn)為false不區(qū)分大小寫
- dir 排列方式
- folderSort 將葉子節(jié)點(diǎn)排列到非葉子節(jié)點(diǎn)后面 默認(rèn)為false
- leafAttr 判斷葉子節(jié)點(diǎn)的標(biāo)志,默認(rèn)為leaf,如果node中存在leaf:true參數(shù),就認(rèn)為是葉子節(jié)點(diǎn)
- property 根據(jù)節(jié)點(diǎn)屬性排序,默認(rèn)為text
代碼
- new Ext.tree.TreeSorter(tree,{
- folderSort : true
- });
12.樹形節(jié)點(diǎn)視圖 Ext.tree.TreeNodeUI
- Ext.treeTreeNodeUI是生成Ext.tree.TreeNode實例時默認(rèn)使用的視圖組件.
- 在生成每一個Ext.tree.TreeNode實例時,它會先查找this.attributes.uiProvider和this.defaultUI.
- 如果有任何一個屬性存在,它就會使用這個屬性創(chuàng)建自己的視圖.
- 如果這兩個屬性都不存在就會適應(yīng)Ext.tree.TreeNodeUI創(chuàng)建視圖.
- 因此,在屬性結(jié)構(gòu)中通常都使用Ext.tree.TreeNodeUI作為樹形節(jié)點(diǎn)的視圖.
- 可以通過node.ui的方式獲得某個Ext.tree.TreeNode實例對應(yīng)的Ext.tree.TreeNodeUI
效果圖

list.txt
- [{
- text : '01',
- children : [
- { text : '01-01' , leaf : true , checked : false },
- { text : '01-02' , leaf : true , checked : false }
- ]
- },{
- text :'02',
- children : [
- { text : '02-01' , leaf : true , checked : false },
- { text : '02-02' , leaf : true , checked : false }
- ]
- }]
index.jsp
- <style type="text/css">
- .big {
- font-weight: bold;
- }
- </style>
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.TreePanel({
- region: 'center',
- collapsible: true,
- title: '樹形節(jié)點(diǎn)視圖',
- width: 200,
- border : false,
- autoScroll: true,
- animate : true,
- rootVisible: false,
- split: true,
- loader : new Ext.tree.TreeLoader({
- dataUrl : 'list.txt'
- }),
- root : new Ext.tree.AsyncTreeNode({
-
- id : '0',
- text : '我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items: [tree]
- });
- tree.on('click',function(node){
-
- var treeNodeUI = node.ui;
-
- treeNodeUI.addClass('big');
- (
- function(){
- treeNodeUI.removeClass('big');
- }
- ).defer(1000);
- });
- });
- </script>
- treeNodeUI的方法
- getAnchor(),getIconEl(),getTextEl()這3個函數(shù)可以分別獲取頁面上與樹形對應(yīng)的
- <a>標(biāo)簽,包含圖標(biāo)的<img>標(biāo)簽,包含文字的<span>標(biāo)簽部分
- hide()和show()函數(shù)可以控制樹形節(jié)點(diǎn)是否隱藏
- isChecked()和toggleCheck()函數(shù)可以判斷和修改樹形節(jié)點(diǎn)中的Checkbox的狀態(tài),這兩屬性必須節(jié)點(diǎn)包含Checkbox,否則isChecked()會一直返回false
13.表格與樹的結(jié)合 Ext.ux.tree.ColumnTree()
- Ext.ux.tree.ColumnTree屬于EXT的擴(kuò)展件,為了使用Ext.ux.tree.ColumnTree,
- 我們首先需要引用Ext發(fā)布包中的column-tree.css,ColumnNodeUI.css,以及ColumnNodeUI.js三個文件
- 需要注意的是:我們要給每一個節(jié)點(diǎn)設(shè)置uiProvider:'col',這樣在生成樹時TreeLoader會預(yù)先定義的uiProviders參數(shù)中取得'col'對應(yīng)的Ext.ux.tree.ColumnNodeUI,用它來作為顯示樹形節(jié)點(diǎn)的視圖
效果圖

list.jsp
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
-
- String node = request.getParameter("node");
- System.out.println("node="+node);
- String json =
- "["+
- "{km:'深入淺出ExtJs',ks:'12month',js:'',uiProvider:'col',"+
- "children:["+
- "{km:'ExtJs01',ks:'6month',js:'lwc',uiProvider:'col',leaf:true},"+
- "{km:'ExtJs02',ks:'6month',js:'wr',uiProvider:'col',leaf:true}"+
- "]}"+
- ",{km:'深入淺出Java',ks:'10month',js:'',uiProvider:'col',"+
- "children:["+
- "{km:'Java01',ks:'4month',js:'tom',uiProvider:'col',leaf:true},"+
- "{km:'Java02',ks:'6month',js:'cat',uiProvider:'col',leaf:true}"+
- "]}"+
- "]";
- response.getWriter().write(json);
- %>
index.jsp
- <!-- 使用ColumnTree需要帶入這兩個文件 -->
- <link rel="stylesheet" type="text/css" href="<%=rootpath%>/ext/ux/css/ColumnNodeUI.css"/>
- <script type="text/javascript" src="<%=rootpath%>/ext/ux/ColumnNodeUI.js"></script>
- <script type="text/javascript" defer>
- Ext.onReady(function(){
- Ext.BLANK_IMAGE_URL = '<%=rootpath%>/ext/resources/images/default/s.gif';
- var tree = new Ext.tree.ColumnTree({
-
- width: 451,
- height: 200,
- rootVisible:false,
- autoScroll:false,
- title: '示例',
- columns:[{
- header:'科目',
- width:230,
- dataIndex:'km'
- },{
- header:'課時',
- width:100,
- dataIndex:'ks'
- },{
- header:'講師',
- width:100,
- dataIndex:'js'
- }],
- loader: new Ext.tree.TreeLoader({
- dataUrl:'list.jsp',
- uiProviders:{
- 'col': Ext.tree.ColumnNodeUI
- }
- }),
- root: new Ext.tree.AsyncTreeNode({
-
- id : '0',
- text:'我是根'
- }),
- listeners: {
- afterrender: function(node) {
-
- tree.expandAll();
- }
- }
- });
- new Ext.Viewport({
- items : [tree]
- });
- });
- </script>
|