我使用JTree 建立一棵树,在点击“+”时,删除该节点的子节点,然后再重新添加节点,用updateUI()刷新,为什么在第一次点击“+”时产生异常,并且不能打开节点,而第二次再点就好了,如果缩起来再展开的话也正常,而且还偶然发现如果添加一个按扭,在点击时再调用updateUI()刷新就正常。用updateUI()刷新不会把展开的节点缩回去,就不用重新展开了。使用reload()的话还得重新展开,而且我试了也有其他的问题,总之就没找到一个能完全解决的方法。真奇怪,直接调用和点击按扭再调用updateUI()有什么不一样的吗,请高手指点:
DefaultMutableTreeNode TreeMem = (DefaultMutableTreeNode)treePath.getLastPathComponent();
      TreeMem.removeAllChildren(); //删除原来节点,然后刷新,再重新添加其它节点
      jTree1.updateUI();//有异常
附异常如下:java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI.updateSize(BasicTreeUI.java:1647)
at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(BasicTreeUI.java:2096)
at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(BasicTreeUI.java:2082)
at javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl(BasicTreeUI.java:2036)
at javax.swing.plaf.basic.BasicTreeUI$MouseHandler.handleSelection(BasicTreeUI.java:2831)
at javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(BasicTreeUI.java:2801)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.Component.processMouseEvent(Component.java:5097)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3195)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

解决方案 »

  1.   

    1. 添加子节点:
    DefaultTreeModel model =((DefaultTreeModel) getTreeLdap() .getModel();model.insertNodeInto(kid, node, node.getChildCount() - 1);node 是当前路径末端节点, kid 是新创建的子节点.用这个方法添加一个子节点后就不需要刷新树,它自动更新,也不需要你再手工展开了.2. 删除子节点.
    model .removeNodeFromParent(node);这个删除子节点也会自动更新.
      

  2.   

    我使用repaint更新的,问题也解决了,多谢humanity了。不知道这里怎么结贴和给分啊