和風(fēng)細(xì)雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運(yùn)用之術(shù)自出。

          JTree樹控件的使用

          樹和節(jié)點(diǎn)的基本概念

          樹可以用圖形的方式顯示眾多的節(jié)點(diǎn)以及它們之間的關(guān)系,最常見的樹的例子就是目錄樹。
          所有組成樹的元素都成為節(jié)點(diǎn)(Node),一棵樹的最頂層的節(jié)點(diǎn)稱為根節(jié)點(diǎn),如Program;而沒有子節(jié)點(diǎn)的節(jié)點(diǎn)成為葉子節(jié)點(diǎn),如domain。在層次結(jié)構(gòu)中,上層的節(jié)點(diǎn)是下層節(jié)點(diǎn)的父節(jié)點(diǎn),而下層節(jié)點(diǎn)是上層節(jié)點(diǎn)的子節(jié)點(diǎn),如圖:Program是C# Programs和Programs的父節(jié)點(diǎn);FileBatchRemaer20070801094605是C# Programes的子節(jié)點(diǎn)。

          有關(guān)樹JTree的類和接口

          JTree                           顯示樹的核心基本類。
          TreeModel                  定義了樹的數(shù)據(jù)模型接口
          DefaultTreeModel      默認(rèn)的樹模型接口實(shí)現(xiàn)類
          TreeModelListener     樹模型的事件監(jiān)聽器
          TreePath                      樹路徑。一個(gè)路徑就是一個(gè)對象數(shù)組,對應(yīng)于樹模型中從根節(jié)點(diǎn)到選定節(jié)點(diǎn)上的所有節(jié)點(diǎn)集合。數(shù)組的第一個(gè)元素是根節(jié)點(diǎn),按樹的層次關(guān)系依次在數(shù)組中給出中間節(jié)點(diǎn),最后一個(gè)元素是選定的節(jié)點(diǎn)。
          MutableTreeNode      樹節(jié)點(diǎn)接口。對應(yīng)樹中的節(jié)點(diǎn)。樹節(jié)點(diǎn)接口定義了與父子節(jié)點(diǎn)有關(guān)的方法。因此,利用樹節(jié)點(diǎn)可以遍歷整棵樹。
          DedaultMutableTreeNode 默認(rèn)的樹節(jié)點(diǎn)的實(shí)現(xiàn)類。
          TreeSelectionModel 定義了在樹上的選擇節(jié)點(diǎn)的數(shù)據(jù)模型接口。樹選擇模型決定了選擇節(jié)點(diǎn)的策略以及被選擇節(jié)點(diǎn)的信息。
          TreeSelectionModelListener 樹選擇模型事件的監(jiān)聽器。

          代碼實(shí)例:構(gòu)建一棵樹

          DefaultMutableTreeNode root = new DefaultMutableTreeNode("Java");

          DefaultMutableTreeNode j2seNode=new DefaultMutableTreeNode("J2SE(JavaSE)");
          DefaultMutableTreeNode swingNode=new DefaultMutableTreeNode("Swing");
          DefaultMutableTreeNode socketNode=new DefaultMutableTreeNode("Socket");
          DefaultMutableTreeNode threadNode=new DefaultMutableTreeNode("Thread");
          j2seNode.add(swingNode);
          j2seNode.add(socketNode);
          j2seNode.add(threadNode);

          DefaultMutableTreeNode j2eeNode=new DefaultMutableTreeNode("J2EE(JavaEE)");
          DefaultMutableTreeNode jspservletNode=new DefaultMutableTreeNode("Jsp/Servlet");
          DefaultMutableTreeNode jdbcNode=new DefaultMutableTreeNode("JDBC");
          DefaultMutableTreeNode javaMailNode=new DefaultMutableTreeNode("Java Mail");
          j2eeNode.add(jspservletNode);
          j2eeNode.add(jdbcNode);
          j2eeNode.add(javaMailNode);

          root.add(j2seNode);
          root.add(j2eeNode);
          tree = new JTree(root);


          相關(guān)語句解釋

          // 創(chuàng)建一個(gè)樹節(jié)點(diǎn),文字為J2SE(JavaSE)
          DefaultMutableTreeNode j2seNode=new DefaultMutableTreeNode("J2SE(JavaSE)");

          // 創(chuàng)建一個(gè)文字為“Swing”的節(jié)點(diǎn),添加在節(jié)點(diǎn)j2seNode下
          DefaultMutableTreeNode swingNode=new DefaultMutableTreeNode("Swing");
          j2seNode.add(swingNode);

          // 創(chuàng)建一個(gè)文字為Java的節(jié)點(diǎn)作為根節(jié)點(diǎn),然后以此根節(jié)點(diǎn)構(gòu)建一棵樹。j2seNode,j2eeNode掛在root 下
          DefaultMutableTreeNode root = new DefaultMutableTreeNode("Java");
          .......
          root.add(j2seNode);
          root.add(j2eeNode);
          tree = new JTree(root);

          注意: JTree和JTextArea,JTable一樣,也需要放在一個(gè)JScrollPane中。

          給樹控件添加監(jiān)聽

          tree.addTreeSelectionListener(new TreeSelectionListener() {
                public void valueChanged(TreeSelectionEvent evt) {
                    //  取得選擇狀態(tài)變化的所有路徑
                    TreePath[] paths = evt.getPaths();
           
                    for (int i=0; i<paths.length; i++) {
                        // 如果處于選擇狀態(tài)
                        if (evt.isAddedPath(i)) {
                          // 將路徑轉(zhuǎn)化為節(jié)點(diǎn)數(shù)組
                          Object[] nodes=paths[i].getPath();
                         
                          // 得到最后一個(gè)節(jié)點(diǎn),即選擇的節(jié)點(diǎn)
                          DefaultMutableTreeNode node=(DefaultMutableTreeNode)nodes[nodes.length-1];
                         
                          // 輸出節(jié)點(diǎn)名
                          System.out.println(node.toString());             
                        }
                    }
                }
            });

          額外的一點(diǎn)美化工作:渲染節(jié)點(diǎn)

          // 設(shè)定葉節(jié)點(diǎn)圖標(biāo)
          Icon leafIcon = new ImageIcon(TreePanel.class.getResource("/leaf.gif"));
          // 設(shè)定關(guān)閉狀態(tài)節(jié)點(diǎn)圖標(biāo)
          Icon closedIcon = new ImageIcon(TreePanel.class.getResource("/close.gif"));
          // 設(shè)定打開狀態(tài)節(jié)點(diǎn)圖標(biāo)
          Icon openIcon = new ImageIcon(TreePanel.class.getResource("/open.gif"));
           
          // 取得樹的渲染器
          DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer();
          renderer.setLeafIcon(leafIcon);// 設(shè)定葉節(jié)點(diǎn)圖標(biāo)
          renderer.setClosedIcon(closedIcon);// 設(shè)定關(guān)閉狀態(tài)節(jié)點(diǎn)圖標(biāo)
          renderer.setOpenIcon(openIcon);// 設(shè)定打開狀態(tài)節(jié)點(diǎn)圖標(biāo)

           

          posted on 2008-03-03 23:02 和風(fēng)細(xì)雨 閱讀(2470) 評論(6)  編輯  收藏 所屬分類: Swing

          評論

          # re: JTree樹控件的使用 2008-04-06 11:43 藍(lán)狐

          喜歡的風(fēng)格,能否交個(gè)朋友啊?我的MSN:zrz55661@hotmail.com  回復(fù)  更多評論   

          # re: JTree樹控件的使用 2008-04-06 15:46 和風(fēng)細(xì)雨

          有朋自遠(yuǎn)方來,不亦樂乎。msn已經(jīng)加你了。  回復(fù)  更多評論   

          # re: JTree樹控件的使用[未登錄] 2008-04-10 13:28 JAVA初學(xué)者

          我也是JAVA開發(fā)的,能否交個(gè)朋友啊,我的MSN:tianjin_123@hotmail.com  回復(fù)  更多評論   

          # re: JTree樹控件的使用 2008-04-10 22:07 YANGH-7

          謝謝,我是Java初學(xué)者,現(xiàn)在學(xué)點(diǎn)Java Swing的東西,感到挺吃力,看了你講的關(guān)于JTree的東西,好理解多了,原來都在看文檔頭暈啊  回復(fù)  更多評論   

          # re: JTree樹控件的使用[未登錄] 2008-04-17 16:34 Lucifer

          和風(fēng)細(xì)雨你好!看了你的博客我很振奮,xjynxf@hotmail.com我的MSN,很想跟你交朋友!請加我。  回復(fù)  更多評論   

          # re: JTree樹控件的使用 2009-05-18 16:49 來訪者

          你好,我想問你一下是否可以在葉子節(jié)點(diǎn)的內(nèi)容部分用某個(gè)組件來表示。例如我想用一個(gè)帶有圖像和文字的組件來表示你例子中的Swing,如果方便的話,添加我的msn:wensheng2007@gmail.com  回復(fù)  更多評論   

          主站蜘蛛池模板: 和林格尔县| 金乡县| 乐平市| 郧西县| 绵竹市| 右玉县| 越西县| 新蔡县| 唐山市| 石台县| 凭祥市| 炎陵县| 通海县| 丹凤县| 达孜县| 云安县| 筠连县| 麻栗坡县| 子洲县| 海丰县| 阳春市| 开化县| 闸北区| 定远县| 平泉县| 奇台县| 潍坊市| 济宁市| 伊宁县| 松溪县| 通辽市| 若尔盖县| 泗阳县| 成都市| 洪泽县| 四会市| 南郑县| 澳门| 灵台县| 新和县| 城口县|