三大控件之————JTree

来源:互联网 发布:阿里云服务器闪退 编辑:程序博客网 时间:2024/06/07 10:40


         public class TreePanel extends JScrollPane {
 
 private FileSystemView fsv = FileSystemView.getFileSystemView();   //得到系统桌面文件视图

 private Object[] objects = new Object[0];                         //对象数组
 private JTree tree;
 private DefaultTreeModel model;                                     //JTree模型
 
 public TreePanel() {                                  //(注:DynamicUtilTreeNode为DefaultMutableTreeNode的子类)
  DynamicUtilTreeNode root = new DynamicUtilTreeNode(         //model的创建需要一个TreeNode的实例参数
    fsv.getHomeDirectory(), objects);         
  tree = new JTree(model = new DefaultTreeModel(root));      //创建JTree
  tree.setCellRenderer(cellRenderer);                        //设置JTree渲染器
  tree.addTreeWillExpandListener(willExpandListener);        //设置JTree将要展开事件处理
  getViewport().setView(tree);
  addChildren(root);
  
 }
 
 
 private void addChildren(DynamicUtilTreeNode parent) {      //传入一个TreeNode
  if (parent.getChildCount() > 0) {                  //如果子节点数大于0,返回(说明已经展开了)
   return;
  }
  Object value = parent.getUserObject();             
  if (!(value instanceof File)) {                    //如果节点不是文件,返回
   return;
  }
  File[] files = ((File) value).listFiles();

  for (File file : files) {                      //根据JTree根节点遍历下面子节点,并添加到model中
   model.insertNodeInto(
     new DynamicUtilTreeNode(file, file.isDirectory() ? objects
       : null), parent, parent.getChildCount());
  }
 }

**************************************************************** 
                                                                //JTree将要展开事件
private TreeWillExpandListener willExpandListener = new TreeWillExpandListener() {  
  
  @Override
  public void treeWillExpand(TreeExpansionEvent event)   //JTree将要展开
    throws ExpandVetoException {
   Object value = event.getPath().getLastPathComponent();   //得到当前选中的节点对象
   if (value instanceof DynamicUtilTreeNode) {
    addChildren((DynamicUtilTreeNode) value);      //添加根节点下面的子节点
   }
  }
  
  @Override
  public void treeWillCollapse(TreeExpansionEvent event)
    throws ExpandVetoException {
  }
 };

**************************************************************** 
  
                                 (注:一般是将渲染器器单独写成一个类)
 private TreeCellRenderer cellRenderer = new DefaultTreeCellRenderer() {    //JTree的渲染器

                            //此处也可以使用如下类加载方式加载自己想要显示的图标
                  private ImageIcon img = new ImageIcon(MyTreeCellRenderer.class.getResource("down.png"));

  @Override
  public Component getTreeCellRendererComponent(JTree tree, Object value,
    boolean sel, boolean expanded, boolean leaf, int row,
    boolean hasFocus) {
   if (value instanceof DynamicUtilTreeNode) {
    value = ((DynamicUtilTreeNode) value).getUserObject();
    if (value instanceof File) {
     File file = (File) value;
     value = fsv.getSystemDisplayName(file);    //设置当前节点对象为系统视图
      Icon icon = fsv.getSystemIcon(file);       //得到系统当前图标
     setOpenIcon(icon);                         //设置节点在三中状态下的显示图标
     setClosedIcon(icon);
     setLeafIcon(icon);
    }
   }
   return super.getTreeCellRendererComponent(tree, value, sel,
     expanded, leaf, row, hasFocus);
  }
 };
}
             这里需要注意:tree  为要绘制节点的树               expanded 节点是否展开或可见
                           value 为要绘制的节点对象             leaf      该节点为叶子节点
                           selected  该节点的选中状态           row      显示包含该节点的那行
                           hasFocus  当前选中的节点拥有输入焦点
******************************************************************************************************************

    构造JTreed的常用方法是:
                   private DefaultMutableTreeNode node = new DefaultMutableTreeNode("name"); 
                                               //先创建DefaultMutableTreeNode,TreeNode上可以随意添加子节点
                                              可以使用add()方法添加子节点
                   DefaultTreeModel mode=new DefaultTreeModel(node);
                                              //再创建DefaultTreeModel,并传入node
                   JTree tr=new JTree();     
                                              //最后构建JTree,并传入(mode)
   

   操作JTree中数据的常用方法是:
                  mode.insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index);
                                            //直接操作模型即可  (其他方法可以直接查JDK)
   

   JTree的一般事件处理:                                                     (可直接用内部类实现)
                   public void valueChanged(TreeSelectionEvent e) {           //JTree的 TreeSelectionListener事件处理
                  
                      DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                           tree.getLastSelectedPathComponent();         //得到JTree的节点对象
                                                                    (注:这是最常用的得到选中节点对象的方法)
                      if (node == null) return;

                      if (node.isLeaf()) {                                 //如果是叶子节点,
                         System.out.println("选中了叶子节点");
                       } else {                                            //根节点
                       System.out.println("选中了根节点");
                       }
               }

 

 JTree的展开和关闭事件处理:
       
            tree.addTreeExpansionListener(this);                      //JTree已经展开或关闭事件
            tree.addTreeWillExpandListener(this);                     //JTree将要展开或关闭事件

           class DemoArea extends JScrollPane                         //也可以用内部类方式实现
                   implements TreeExpansionListener,                
                              TreeWillExpandListener {                  //设置JTree的将要展开事件和已经展开事件
           
            public void treeWillExpand(TreeExpansionEvent e) {        //将要展开或关闭事件函数
        
             }

            public void treeWillCollapse(TreeExpansionEvent e) {
        
             }

            public void treeExpanded(TreeExpansionEvent e) {           //已经展开或关闭事件函数

            }

             public void treeCollapsed(TreeExpansionEvent e) {
        
            }
         }


JTree的其他一些实用方法或重点:
                                                                        //设置树一次只能选择一个
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 
            scrollPathToVisible(TreePath path)   这个函数将展开路径中所有的节点,(添加新节点后使用)
           
            setEditable(boolean flag)           设置可以编辑

           setRootVisible(boolean rootVisible)   设置根节点是否显示
 
           putClientProperty(key, value)         设置显示水平线条

           setShowsRootHandles(newValue)          设置是否显示树的把手

 

 

 

 

 

 

 

 

 

原创粉丝点击