栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将一些节点添加到基础模型后,如何刷新JTree?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将一些节点添加到基础模型后,如何刷新JTree?

我遇到了同样的“问题”:调用

treeNodesInserted()
并没有导致我
JTree
更新其内容。

但问题出在其他地方:我为使用了错误的构造函数

TreeModelEvent
。我以为我可以创建
TreeModelEvent
treeNodesInserted()
这样的:

//-- Wrong!!TreePath path_to_inserted_item =  ;TreeModelEvent tme = new TreeModelEvent(my_source, path_to_inserted_item);

这行不通。

TreeModelEvent
docs中所述,此构造函数仅用于
treeStructureChanged()
。但是
treeNodesInserted()
treeNodesRemoved()
treeNodesChanged()
我们应该使用另一个构造函数:

TreePath path_to_parent_of_inserted_items =  ;int[] indices_of_inserted_items =  ;Object[] inserted_items =  ;TreeModelEvent tme = new TreeModelEvent(      my_source,      path_to_parent_of_inserted_items,      indices_of_inserted_items,      inserted_items   );

此代码有效,并

JTree
正确更新其内容。


UPD: 实际上,文档尚不清楚使用这些

TreeModelEvent
s的情况,尤其是使用s
还不清楚
JTree
,因此,我想讲述一些在我试图弄清楚如何处理所有这些内容时遇到的问题。

首先,正如Paralife指出的那样,插入/更改/删除节点或更改树结构的情况不是正交的。所以,

问题1: 我们什么时候应该使用

treeNodesInserted()
/
Changed()
/
Removed()
,以及何时
treeStructureChanged()

答:

treeNodesInserted()
/
Changed()
/
Removed()
可如果只是所有受影响的节点具有相同的父使用。否则,您可能会多次调用这些方法,或者仅调用
treeStructureChanged()
一次(并将受影响节点的根节点传递给它)。因此,
treeStructureChanged()
是一种普遍的方式,而
treeNodesInserted()
/
Changed()
/
Removed()
是更具体。

问题2: 至于

treeStructureChanged()
是一个普遍的方式,为什么我需要处理这些
treeNodesInserted()
/
Changed()
/
Removed()
?只需致电
treeStructureChanged()
似乎更容易。

答:
如果您

JTree
用来显示树的内容,那么以下内容可能对您来说是一个惊喜(对我而言):当您调用时
treeStructureChanged()
,则
JTree
不会保持子节点的扩展状态!考虑这个例子,这是我们
JTree
现在的内容:

[A] |-[B] |-[C] |  |-[E] |  |  |-[G] |  |  |-[H] |  |-[F] |     |-[I] |     |-[J] |     |-[K] |-[D]

然后,您对进行了一些更改

C
(例如,将其重命名为
C2
),并要求
treeStructureChanged()
这样做:

  myTreeModel.treeStructureChanged(        new TreeModelEvent(this,new Object[] { myNodeA, myNodeC } // Path to changed node)        );

然后,节点

E
F
将崩溃!您的
JTree
外观将如下所示:

[A] |-[B] |-[C2] |  +-[E] |  +-[F] |-[D]

为了避免这种情况,您应该使用

treeNodesChanged()
,例如:

  myTreeModel.treeNodesChanged(        new TreeModelEvent(this,new Object[] { myNodeA }, // Path to the _parent_ of changed itemnew int[] { 1 },          // Indexes of changed nodesnew Object[] { myNodeC }, // Objects represents changed nodes    //    (Note: old ones!!!     //     I.e. not "C2", but "C",    //     in this example))        );

然后,将保持扩展状态。


我希望这篇文章对某人有用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号