JTree 展开后又折叠了。这是怎么回事?
我有仔细看过,当鼠标按下的时候是展开了,可是当鼠标松开的时候就折叠了。
我没有添加鼠标按下或释放的事件,在这个里边只有一个事件,就是树展开的事件。

解决方案 »

  1.   

    private class TreeExpansion implements TreeExpansionListener {
            public void treeExpanded(TreeExpansionEvent event) {
                TreePath path = event.getPath();
                MultiTreeNode node = (MultiTreeNode) path.getLastPathComponent();
                DTOTreeModel model = (DTOTreeModel) getModel();
                String primaryKey = model.getNodeObjectPropertyName();
                if (null == entityObj || "".equals(entityObj) ||
                    null == primaryKey || "".equals(primaryKey)) {
                    return;
                }
                if (node == null) {
                    node = (MultiTreeNode) model.getRoot();
                 }
                int index = 1;
                Object nodeObj = model.getObject(node);
               _getter = ReflectUtil.getGetter(nodeObj.getClass(), primaryKey);
               appendChild(index, node, model);  //见下面
               model.reload(node);
               requestFocus();
               revalidate();
               SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                    updateUI();
                  }
              });
             }
              public void treeCollapsed(TreeExpansionEvent event) {
               }
       }private void appendChild(int index, MultiTreeNode node, DTOTreeModel model) {
            index++;
            if (index <= level) {
                if (null != node) {
                    Object dto = model.getObject(node);
         //如果节点下面的子节点数大于1,说明该节点下的子节点已经全部找出来了,不需要再从数据库中查找
                    if (node.getChildCount() > 1) {
                        for (int i = 0; i < node.getChildCount(); i++) {
                            MultiTreeNode child = (MultiTreeNode) node.
                                                  getChildAt(i);
                            appendChild(index, child, model);
                        }
                    } else {
            //如果node下面的子节点数量等于1,首先需要把该节点删掉,然后再添加进去,否则会重复添加
                        if (node.getChildCount() == 1) {
                            MultiTreeNode child = (MultiTreeNode) node.
                                                  getChildAt(0);
                            node.remove(child);
                        }
              //当flag=true时,只查找node节点下的一条数据,说明该节点下还存在子节点即可
                        //当flag=false时,需查找node节点下的全部数据,并添加到node节点下面
                        boolean flag = false;
                        if (level == index) {
                            flag = true;
                        }
                        Object[] obj = getObjects(model, node, flag); //得到节点下的数据
                        if (obj != null && obj.length > 0) {
                            model.createNodesStruct(obj, node);
                        }
                        for (int i = 0; i < node.getChildCount(); i++) {
                            MultiTreeNode child = (MultiTreeNode) node.
                                                  getChildAt(i);
                            appendChild(index, child, model);
                        }
                    }
                }
            }
        }
      

  2.   

    谢谢 aerter,我先去看看先
      

  3.   

    谢谢 aerter, 那个帖子用的是鼠标双击打开节点。
      

  4.   

    updateUI();没有看其他的。这个放在最后的话,会出现你所说的那个问题。这个方法通常在更改了皮肤或者UI展现后调用。这里你只是更改了数据,并无必要用到这个方法。请注掉此方法的调用。在看看。如有问题,再仔细看其他的部分、
      

  5.   

    我仔细看了我的代码,没有什么问题,根本就没有写要折叠的代码呀。郁闷ing.........
      

  6.   

    自己再定义一个MouseListener,处理单击事件
      

  7.   

    这不是你有什么折叠起来的代码。而是你所调用的方法,要按照初始的情形去展示,而默认最初的情形就是折叠的。尽管你之前展开到了某一层,但是,你最后调用了updateUI();就一定会回到最初的形式,也就是collapse的形式。你可以去读一下源码。
    至于你之前调用的revalidate,这个我记不太清了。你自己试验一下有没有必要。
      

  8.   

    谢谢 gentalguo。
    按你说的,把那个updateUI();去掉了,果然就没有出现那个问题了。
    学习了,updateUI();不能随便用。
    谢谢大家了。
    结贴去了。
      

  9.   

    虽然结贴了,但是又有一个问题了,去掉了updateUI();我的界面没法同步了。
    现在我的界面是这样的,一边是树结构,一边是表格,当树展开多少节点时,表格中就应该要有多少行,可是现在不能同步了。
      

  10.   

    具体说明。
    例如:
    A
    +B
     -C
     -D
    +E
     -F
    +G
     -H
     -I
     -J
    那么这样的树结构,以此为例,描述一下你的需求,以及问题。请尽可能详细。
    updateUI方法是树内部的同步,实际上来说,一棵树只有一个展现。如果你更改了这棵树的L&F,或者,一棵树默认的使用BasicTreeUI,而你更改了其使用的UI那么,在设置tree.setUI(...);之后调用此方法。
    其他情形,包括更改了renderer和editor,都不必使用此方法。
    但你描述的是树和table之间的一种对应关系。应属于你的业务逻辑之间的逻辑关系。
      

  11.   

    非常感谢 gentalguo。
    问题解决了,本来跟updateUI()应该没有关系的,是我自己设计的时候逻辑有点问题。
    这是我CSDN上发帖最满意的一次。