我遇到了同样的“问题”:调用
treeNodesInserted()并没有导致我
JTree更新其内容。
但问题出在其他地方:我为使用了错误的构造函数
TreeModelEvent。我以为我可以创建
TreeModelEvent为
treeNodesInserted()这样的:
//-- Wrong!!TreePath path_to_inserted_item = ;TreeModelEvent tme = new TreeModelEvent(my_source, path_to_inserted_item);
这行不通。
如
TreeModelEventdocs中所述,此构造函数仅用于
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: 实际上,文档尚不清楚使用这些
TreeModelEvents的情况,尤其是使用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)) );然后,将保持扩展状态。
我希望这篇文章对某人有用。



