树节点关闭异常

chenrt 2009-06-15 04:34:14
一棵树,展开一个非叶子节点A,当我点击A的叶子节点时没有什么问题,能够正常响应事件,但是

当我把展开的A从展开状态关闭时,出现了如下异常(此时叶子节点仍处于选中状态)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
javax.swing.JTree.fireValueChanged(Unknown Source)
javax.swing.JTree.DefalutTreeSelectionNodel.fireValueChanged(Unknown Source)
javax.swing.JTree.DefalutTreeSelectionNodel.notifyPathChanged(Unknown Source)
javax.swing.JTree.DefalutTreeSelectionNodel.removeSelectionPath(Unknown Source)
……
请问该怎么解决?
...全文
66 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenrt 2009-06-24
  • 打赏
  • 举报
回复
?萨德复试发生地
chentao19860501 2009-06-19
  • 打赏
  • 举报
回复
8楼说的真清晰
wensheng_zh2007 2009-06-19
  • 打赏
  • 举报
回复
lz可以参考一下8楼的。再注意当前选中的是哪个节点
gojav 2009-06-17
  • 打赏
  • 举报
回复
我也遇到过这个问题,已经解决。看看我能不能帮你。
DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();

在对selectionNode进行操作的时候,如果是用的if else等进行选择操作,最后加一个else{}
就是什么也不做。
gentalguo 2009-06-17
  • 打赏
  • 举报
回复
这个当然有问题。树节点从展开到关闭,默认的情形,选中的对象和状态会发生变化的。
DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
你在后面加一句打印,打印这个selectionNode 。节点关闭出异常,肯定是这个对象为null。
你说的状况硬是这样吧:
A
-B
-C
你选中C或者B然后关闭A。你说此时叶子节点仍处于选中状态?如果你没有自己改写其方法进行特殊处理,叶子节点是不可能仍然处于选中状态的。系统默认动作清除了选中。
为保证程序的健壮性,无论怎样你都应该增加一点判断。至少


if (selectionNode != null){
String name = (String) selectionNode.getUserObject().toString();
if (selectionNode.isLeaf()) {
System.out.println(name);
} else if(!selectionNode.isLeaf()){
System.out.println("父节点");
}
}


当然,以上是建立在你确实没有对关闭节点做特殊的处理。当然你用的肯定是addTreeSelectionListener。监听器的触发,是在树已经完成了自身的所有动作后,也就是说,你这里执行之前,树的状态该改变的已经改变过了。
以上仅根据你所给出的部分代码做出判断。如果我说的不对,请再多给一些代码信息。
fenggang19830707 2009-06-17
  • 打赏
  • 举报
回复
学习
chenrt 2009-06-16
  • 打赏
  • 举报
回复
部分代码:
public void valueChanged(TreeSelectionEvent e) {
// TODO Auto-generated method stub
JTree tree = (JTree) e.getSource();
DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
String name = (String) selectionNode.getUserObject().toString();
if (selectionNode.isLeaf()) {
System.out.println(name);
} else if(!selectionNode.isLeaf()){
System.out.println("父节点");
}

}
chenrt 2009-06-16
  • 打赏
  • 举报
回复
不好意思,我稍候贴代码
chentao19860501 2009-06-16
  • 打赏
  • 举报
回复
就是,贴点代码看看
求解的根号三 2009-06-15
  • 打赏
  • 举报
回复
应该是结点尾巴问题
j1223jesus 2009-06-15
  • 打赏
  • 举报
回复
贴点代码看看。。。。
LazyCat2222 2009-06-15
  • 打赏
  • 举报
回复
你Debug跟踪一下 是在哪里出的异常
LazyCat2222 2009-06-15
  • 打赏
  • 举报
回复
可能没有获取到选中焦点的信息

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧