JTree展开后又折叠 JTree 展开后又折叠了。这是怎么回事?我有仔细看过,当鼠标按下的时候是展开了,可是当鼠标松开的时候就折叠了。我没有添加鼠标按下或释放的事件,在这个里边只有一个事件,就是树展开的事件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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); } } } } } 谢谢 aerter,我先去看看先 谢谢 aerter, 那个帖子用的是鼠标双击打开节点。 updateUI();没有看其他的。这个放在最后的话,会出现你所说的那个问题。这个方法通常在更改了皮肤或者UI展现后调用。这里你只是更改了数据,并无必要用到这个方法。请注掉此方法的调用。在看看。如有问题,再仔细看其他的部分、 我仔细看了我的代码,没有什么问题,根本就没有写要折叠的代码呀。郁闷ing......... 自己再定义一个MouseListener,处理单击事件 这不是你有什么折叠起来的代码。而是你所调用的方法,要按照初始的情形去展示,而默认最初的情形就是折叠的。尽管你之前展开到了某一层,但是,你最后调用了updateUI();就一定会回到最初的形式,也就是collapse的形式。你可以去读一下源码。至于你之前调用的revalidate,这个我记不太清了。你自己试验一下有没有必要。 谢谢 gentalguo。按你说的,把那个updateUI();去掉了,果然就没有出现那个问题了。学习了,updateUI();不能随便用。谢谢大家了。结贴去了。 虽然结贴了,但是又有一个问题了,去掉了updateUI();我的界面没法同步了。现在我的界面是这样的,一边是树结构,一边是表格,当树展开多少节点时,表格中就应该要有多少行,可是现在不能同步了。 具体说明。例如:A+B -C -D+E -F+G -H -I -J那么这样的树结构,以此为例,描述一下你的需求,以及问题。请尽可能详细。updateUI方法是树内部的同步,实际上来说,一棵树只有一个展现。如果你更改了这棵树的L&F,或者,一棵树默认的使用BasicTreeUI,而你更改了其使用的UI那么,在设置tree.setUI(...);之后调用此方法。其他情形,包括更改了renderer和editor,都不必使用此方法。但你描述的是树和table之间的一种对应关系。应属于你的业务逻辑之间的逻辑关系。 非常感谢 gentalguo。问题解决了,本来跟updateUI()应该没有关系的,是我自己设计的时候逻辑有点问题。这是我CSDN上发帖最满意的一次。 求IPMI java实例 sql2000 preparedStatement 查询语句出错 java类装载机制的实现!!! 请问 this 和 super 有什么作用,该去怎么用它们? JSP运行问题 删除sql数据库中的表的问题 解难释疑:SVF账票的生成PDF文件? 如何实现圆角窗体和按钮? String问题,关于charset 使用jdbc操作odbc数据源的问题! 如何将java线程绑定到CPU核上? JAVA正则表达式
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);
}
}
}
}
}
至于你之前调用的revalidate,这个我记不太清了。你自己试验一下有没有必要。
按你说的,把那个updateUI();去掉了,果然就没有出现那个问题了。
学习了,updateUI();不能随便用。
谢谢大家了。
结贴去了。
现在我的界面是这样的,一边是树结构,一边是表格,当树展开多少节点时,表格中就应该要有多少行,可是现在不能同步了。
例如:
A
+B
-C
-D
+E
-F
+G
-H
-I
-J
那么这样的树结构,以此为例,描述一下你的需求,以及问题。请尽可能详细。
updateUI方法是树内部的同步,实际上来说,一棵树只有一个展现。如果你更改了这棵树的L&F,或者,一棵树默认的使用BasicTreeUI,而你更改了其使用的UI那么,在设置tree.setUI(...);之后调用此方法。
其他情形,包括更改了renderer和editor,都不必使用此方法。
但你描述的是树和table之间的一种对应关系。应属于你的业务逻辑之间的逻辑关系。
问题解决了,本来跟updateUI()应该没有关系的,是我自己设计的时候逻辑有点问题。
这是我CSDN上发帖最满意的一次。