日期:2014-05-20  浏览次数:20808 次

从JTree删除一个节点后,如何更新显示?
以下是我删除节点的代码:

        public   void   jTree1_valueChanged(TreeSelectionEvent   e)   {
                DefaultMutableTreeNode   selNode   =   (DefaultMutableTreeNode)jTree1.getLastSelectedPathComponent();
                TreeNode   selRoot   =   selNode.getParent();
                selNode.removeFromParent();
        }

我尝试了validate(),inValidate()都不行,有人说用updateUI(),但是这个方法显然不对,这个方法由UIManager调用,用于发出L&F已经更改的通知,并且如果手动调用将发生异常,以下是异常信息:

Exception   in   thread   "AWT-EventQueue-0 "   java.lang.NullPointerException
at   javax.swing.plaf.basic.BasicTreeUI.isToggleEvent(BasicTreeUI.java:2192)
at   javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2257)
at   javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3442)
at   javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3403)
at   java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at   java.awt.Component.processMouseEvent(Component.java:5485)1

at   javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at   java.awt.Component.processEvent(Component.java:5253)
at   java.awt.Container.processEvent(Container.java:1966)
at   java.awt.Component.dispatchEventImpl(Component.java:3955)
at   java.awt.Container.dispatchEventImpl(Container.java:2024)
at   java.awt.Component.dispatchEvent(Component.java:3803)
at   java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at   java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
at   java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at   java.awt.Container.dispatchEventImpl(Container.java:2010)
at   java.awt.Window.dispatchEventImpl(Window.java:1774)
at   java.awt.Component.dispatchEvent(Component.java:3803)
at   java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at   java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at   java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at   java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at   java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at   java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


------解决方案--------------------
我们两个的方法是不一样的,用DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点,JTree会更新的。