要求:增加节点后原来展开的节点还是展开(model.reload()增加了就会全缩起来)
      刷新不要太明显(先通过model.reload(),再找到新node,然后new TreePath(),再tree.expandPath(path)很慢,刷新很明显,而且展开后tree显示经常有问题,node会偏位)用model.reload(root),一样同model.reload()
用model.nodeChanged(node)不增加
用updateUI老是有java.lang.NullPointerException错误(功能倒实现了)
......

解决方案 »

  1.   

    还有,增删节点时用什么好?
    增:    ( ( DefaultMutableTreeNode )tree.getModel().getRoot() ).add( node );    //?
            model.insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index)   //?
    删:    ( ( DefaultMutableTreeNode )tree.getModel().getRoot() ).remove( node );    //?
            model.remove( node )    //?然后如何让新节点显示?model.reload()?tree.repaint()?tree.updateUI()?
      

  2.   

    以TreeNode构造JTree:
       JTree上的每一个节点就代表一个TreeNode对象,TreeNode本身是一个Interface,里面定义了7个有关节点的方法,例如判断是否
    为树叶节点、有几个子节点(getChildCount())、父节点为何(getparent())等等、这些方法的定义你可以在javax.swing.tree的
    package中找到,读者可自行查阅java api文件。在实际的应用上,一般我们不会直接实作此界面,而是采用java所提供的
    DefaultMutableTreeMode类,此类是实作MutableTreeNode界面而来,并提供了其他许多实用的方法。MutableTreeNode本身也是一
    个Interface,且继承了TreeNode界面此类主要是定义一些节点的处理方式,例如新增节点(insert())、删除节点(remove())、设置
    节点(setUserObject())等。整个关系如下图:
        TreeNode----extends--->MutableTreeNode---implements---DefaultMutableTreeNode  接下来我们来看如何利DefaultMutableTreeNode来建立JTree,我们先来看DefaultMutableTreeNode的构造函数:DefaultMutableTreeNode构造函数:
    DefaultMutableTreeNode():建立空的DefaultMutableTreeNode对象。
    DefaultMutableTreeNode(Object userObject):建立DefaultMutableTreeNode对象,节点为userObject对象。
    DefaultMutableTreeNode(Object userObject,Boolean allowsChildren):建立DefaultMutableTreeNode对象,节点为userObject对
                                    象并决定此节点是否允许具有子节点。
      以下为利用DefaultMutableTreeNode建立JTree的范例:TreeDemo2.java
        此程序"资源管理器"为此棵树的根节点.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    public class TreeDemo2{
      public TreeDemo2(){
        JFrame f=new JFrame("TreeDemo2");
        Container contentPane=f.getContentPane();
        
        DefaultMutableTreeNode root=new DefaultMutableTreeNode("资源管理器");
        DefaultMutableTreeNode node1=new DefaultMutableTreeNode("我的公文包");
        DefaultMutableTreeNode node2=new DefaultMutableTreeNode("我的电脑");
        DefaultMutableTreeNode node3=new DefaultMutableTreeNode("收藏夹");
        DefaultMutableTreeNode node4=new DefaultMutableTreeNode("Readme");
        root.add(node1);
        root.add(node2);
        root.add(node3);
        root.add(node4);
        
        DefaultMutableTreeNode leafnode=new DefaultMutableTreeNode("公司文件");
        node1.add(leafnode);
        leafnode=new DefaultMutableTreeNode("私人文件");
        node1.add(leafnode);
        leafnode=new DefaultMutableTreeNode("个人信件");
        
        leafnode=new DefaultMutableTreeNode("本机磁盘(C:)");
        node2.add(leafnode);
        leafnode=new DefaultMutableTreeNode("本机磁盘(D:)");
        node2.add(leafnode);
        leafnode=new DefaultMutableTreeNode("本机磁盘(E:)");
        node2.add(leafnode);
        
        DefaultMutableTreeNode node31=new DefaultMutableTreeNode("网站列表");
        node3.add(node31);
        
        leafnode=new DefaultMutableTreeNode("奇摩站");
        node31.add(leafnode);
        leafnode=new DefaultMutableTreeNode("职棒消息");
        node31.add(leafnode);
        leafnode=new DefaultMutableTreeNode("网络书店");
        node31.add(leafnode);
        
        JTree tree=new JTree(root);
        JScrollPane scrollPane=new JScrollPane();
        scrollPane.setViewportView(tree);
        
        contentPane.add(scrollPane);
       f.pack();
       f.setVisible(true);
       f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){
          System.exit(0);
        }
       });
      }
      public static void main(String[] args){
        new TreeDemo2();
      }  
    }
      

  3.   

    楼上写的真详细!通常构件一棵树,可以把子节点和叶子节点放入两个hash表中,再按楼上的那种方法往root里add。可以满足楼主的要求
      

  4.   

    这个初级吧?
    我要JTree每个节点前后都有图标,所以自己写了IconRenderer implements TreeCellRenderer;要整个树节点排序,tree是用model建的,并override了insertNodeInto()方法。然后就碰到很多问题难以解决了,上面都多少提到了一些:
      因为使用model.insertNodeInto(node, parent,num),好像用tree.repaint()没用了,只有model.reload()好用,(tree.updateUI()也行,但是有时会nullPointer错误),model.reload()有个问题,就是会把expand节点collapse掉,所以我建了一个hashMap去存已展开节点,等model.reload()后,去通过for循环tree.expandPath(( new TreePath(tree.getModel().getRoot()).pathByAddingChild(hashMap.get(i)))重新展开节点,但是会有节点偏位!
    有没有java gui guru告诉我为什么啊?
    (P.S. Tree只建了3层,root setVisible(false)了,只有node和leaf)
      

  5.   

    另外,我add节点不是建立tree时用的,而是事件出发的,node是插入的,(1次要插1个node和N个leaf)add完后tree要刷新的;还有,java tree刷新真是慢阿,连续触发事件时,model.reload()还是updateUI都看得好明显,眼睛都恍花了
      

  6.   

    其实主要就2问题,第一:明明所有新增待add节点都是new的,model.insertNodeInto(node, parent, num)后用updateUI怎么会NullPointerException;第二,insert node以后刷新(不用updateUI)用model.reload()然后再expandPath()为什么会偏位。
    我在sun的swing论坛里也找了,很多人也是这个问题,虽然提供了很多方法,我也试了,但还是不理想,都有小问题
      

  7.   

    我试过,使用DefaultTreeModel的话,用insertNodeInto()方法插入节点后,界面会自动更新,不需要调用reload()或者 updateUI(), 因为insertNodeInto()方法里面会激发节点插入事件,JTree会监听这个事件来更新界面。楼主你自己override了insertNodeInto()方法肯定是忘了调用激发事件的方法了吧。
    以下是DefaultTreeModel的 insertNodeInto()方法,里面的 nodesWereInserted()就是激发事件的语句。    public void insertNodeInto(MutableTreeNode newChild,
                                   MutableTreeNode parent, int index){
            parent.insert(newChild, index);        int[]           newIndexs = new int[1];        newIndexs[0] = index;
            nodesWereInserted(parent, newIndexs);   /*************/
        }
      

  8.   

    用add添加完之后请用  ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(item);来更新状态
      

  9.   

    不一定,使用DefaultTreeModel的话,用insertNodeInto()方法插入节点后,界面会自动更新,不需要调用reload()或者 updateUI(), 因为insertNodeInto()方法里面会激发节点插入事件,???
    不行,我override jTree,node,其他都用的default...,更新model,不刷新树。