當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

          1.1 創建樹組件
          1.1.1 最簡方式

              JTree tree = new JTree();

              在顯示時,樹組件會帶上JTree默認的節點。

          1.1.2 指定樹的節點后創建樹:   

              DefaultMutableTreeNode root = new DefaultMutableTreeNode("根節點");
              root.add(
          new DefaultMutableTreeNode("子節點"));    
              JTree tree 
          = new JTree(root);


          1.1.3 將樹加入到面板中
              以下是將樹加上滾動窗格后加入一個面板的示例程序。    

             JPanel panel=new JPanel();
             panel.setLayout(
          new GridLayout(1,1));
             panel.add(
          new JScrollPane(tree));

             
          1.2 樹節點相關
          1.2.1 取得樹的根節點

              DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
              DefaultMutableTreeNode root 
          =(DefaultMutableTreeNode)model.getRoot();

          1.2.2 更新樹的根節點

              DefaultMutableTreeNode newRoot=;
              DefaultTreeModel model 
          = (DefaultTreeModel) tree.getModel();
              model.setRoot(newRoot);
              model.reload();  
              tree.updateUI();


          1.2.3 從一個節點開始遞歸遍歷其下的所有節點

          private String getNodeText(DefaultMutableTreeNode node){
             Category category
          =(Category)node.getUserObject();
             StringBuilder sb
          =new StringBuilder(category.getText());
            
            
          if (node.getChildCount() >= 0) {
                      
          for (Enumeration<?> e=node.children(); e.hasMoreElements(); ) {
                       DefaultMutableTreeNode childNode 
          = (DefaultMutableTreeNode)e.nextElement();
                          sb.append(getNodeText(childNode));
                      }
                  }
            
            
          return sb.toString();
          }


          1.2.4 在某節點下創建一個節點

              DefaultMutableTreeNode childNode = new DefaultMutableTreeNode();
              childNode.setUserObject();
              parentNode.add(childNode);

          1.2.5 節點改名  

              Category selectedCategory=(Category)clickedNode.getUserObject();
              selectedCategory.setName(
          "");
              clickedNode.setUserObject(selectedCategory);

           

          1.2.6 刪除節點   

              DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
              model.removeNodeFromParent(clickedNode);

              注意被刪除的節點必須有父節點,若要刪除根節點直接用null去替代原有根節點即可,

          1.2.7 遍歷用戶選擇的樹節點   

              TreePath[] paths = tree.getSelectionPaths();
             
              
          for(TreePath selPath:paths){
                  Object[] nodes 
          = selPath.getPath();
            
                  DefaultMutableTreeNode node 
          = (DefaultMutableTreeNode) nodes[nodes.length - 1];  
                  
          // 對node進行處理
              }

           

          1.3 樹的事件處理
          1.3.1 左鍵點擊事件處理
             

             tree.addMouseListener(new MouseAdapter() {
                
          public void mousePressed(MouseEvent e) {
                  
          int selRow = tree.getRowForLocation(e.getX(), e.getY());// 返回節點所在的行,-1表示鼠標定位不在顯示的單元邊界內
                  TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());// 返回指定節點的樹路徑
             
                  
          boolean condition = true;
                  condition 
          = condition && (selRow != -1);// 如果選中
                  
          //condition = condition && (e.getButton() == 1);// 左鍵 e.getButton() == 1  右鍵  e.getButton() == 3
                  condition = condition && (e.getClickCount() == 1);// 單擊
                 
             
                  
          // 如果是左鍵點擊
                  if (condition == true && (e.getButton() == 1)) {
                    Object[] nodes 
          = selPath.getPath();
                   
                    DefaultMutableTreeNode node 
          = (DefaultMutableTreeNode) nodes[nodes.length - 1];
                    Category selectedCategory
          =(Category)node.getUserObject();
             
                  }
                }
              });

           

          1.3.2 在樹節點上點擊右鍵彈出右鍵菜單 

             tree.addMouseListener(new MouseAdapter() {
                
          public void mousePressed(MouseEvent e) {
                  
          int selRow = tree.getRowForLocation(e.getX(), e.getY());// 返回節點所在的行,-1表示鼠標定位不在顯示的單元邊界內
                  TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());// 返回指定節點的樹路徑

                  
          boolean condition = true;
                  condition 
          = condition && (selRow != -1);// 如果選中
                  condition = condition && (e.getClickCount() == 1);// 單擊
                 
                  
          // 如果是右鍵點擊
                  if(condition == true && (e.getButton() == 3)){
                   
                    Object[] nodes 
          = selPath.getPath();
                    DefaultMutableTreeNode rightClickedNode 
          = (DefaultMutableTreeNode) nodes[nodes.length - 1];
                    
                    popupMenu.show(e.getComponent(), e.getX(), e.getY());
                  }
                }
              });

           

          1.4 樹的渲染
          1.4.1 樹節點渲染器示例
           

            public class CategoryNodeRenderer extends DefaultTreeCellRenderer{
              
          private static final long serialVersionUID = 8532405600839140757L;
             
              
          private static final ImageIcon categoryLeafIcon = new ImageIcon(CategoryNodeRenderer.class.getResource("/categoryLeaf.gif"));
              
          private static final ImageIcon openFolderIcon = new ImageIcon(CategoryNodeRenderer.class.getResource("/openFolder.gif"));
              
          private static final ImageIcon closedFolderIcon = new ImageIcon(CategoryNodeRenderer.class.getResource("/closedFolder.gif"));
             
              
          public Component getTreeCellRendererComponent(JTree tree,
                                                        Object value,
                                                        
          boolean sel,
                                                        
          boolean expanded,
                                                        
          boolean leaf,
                                                        
          int row,
                                                        
          boolean hasFocus){
               
                
          super.getTreeCellRendererComponent(tree,  
                            value,
                            sel,  
                            expanded,  
                            leaf,  
                            row,  
                            hasFocus);  
               
                
          if(leaf){
                  setIcon(categoryLeafIcon);
                }
                
          else if(expanded){
                  setIcon(openFolderIcon);
                }
                
          else{
                  setIcon(closedFolderIcon);
                }
                   
                
          return this;   
              }
            }

           

          1.4.2 用樹節點渲染器渲染一棵樹 

            DefaultMutableTreeNode root = null;
            JTree tree 
          = new JTree(root);
            tree.setCellRenderer(
          new CategoryNodeRenderer());

           

          posted on 2010-01-14 15:13 何楊 閱讀(1274) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 阿拉善左旗| 华容县| 万宁市| 张家界市| 子长县| 石城县| 岑巩县| 海门市| 大邑县| 呼和浩特市| 贺州市| 张北县| 齐河县| 芦山县| 佛坪县| 曲松县| 库尔勒市| 康平县| 陈巴尔虎旗| 丽江市| 铜川市| 岳阳市| 烟台市| 青州市| 望奎县| 北安市| 望江县| 鞍山市| 英德市| 津市市| 阿图什市| 桂东县| 凭祥市| 南漳县| 株洲市| 东台市| 增城市| 四川省| 宣武区| 濮阳县| 大关县|