是否有必要在DefaultTreeModel中调用nodesWereInserted()和类似的方法?

时间:2013-12-20 06:11:05

标签: java swing defaulttreemodel

DefaultTreeModel中,您可以使用insertNodeInto()方法插入节点。但是,我注意到还存在nodesWereInserted()方法,它具有非常简洁的Javadoc:

  

在将一些TreeNode插入节点后调用此方法。

我发现这是一种公共方法很奇怪。我希望如果要将ChangeEvents发送给监听器,它应该是insertNodeInto()调用的私有方法。看起来调用一个方法来通知另一个方法调用的更改与Java Swing的设计方式有些不一致(当我向JComboBox添加一个元素时,我没有调用elementIsInserted()方法)。

但我发现在我的代码中,如果我在nodesWereInserted()之后调用insertNodeInto()并不重要。无论哪种方式,结果都会与添加到树中并在GUI中显示的节点相同。

那么有人可以解释一下是否有必要在DefaultTreeModel中调用nodesWereInserted()和类似的方法?如果是这样,为什么? insertNodeInto()不能单独做什么?

3 个答案:

答案 0 :(得分:1)

想象一下,你的TreeModel使用一个独立的真实树,一些节点是由不知道现有模型的单独进程插入的。或者两个TreeModel使用相同的对象树(节点)。 该过程只是将子节点添加到某些节点。或者您在第一个模型中插入节点,但也必须更新第二个模型。

然后你应该以某种方式更新模型。在这种情况下,您使用nodesWereInserted(),并且需要从模型外部调用公共方法。

如果你打电话给insertNodeInto()nodesWereInserted()会在里面调用

答案 1 :(得分:1)

您不需要自己打电话。正如EJP所说,每次插入节点时都会调用它。 您可以在派生类中覆盖此函数,以便在插入节点时发出信号。

如果您没有自己的派生类,则只需添加TreeModellistener即可。

答案 2 :(得分:0)

我们可以拥有自己的自定义树节点,正在进行一些处理。 (假设我们要检查新节点是否有资格插入。) 我们使用DefaultMutableTreeNode.insert()向此自定义树节点添加一个新子节点 方法。此时,我们需要通知模型有关插入的信息 调用DefaultTreeModel.nodesWereInserted()方法。如果修改过于复杂,则可能需要调用DefaultTreeModel.reload()方法。 如果我们自己的树节点中没有任何自定义处理,那么我们 可以通过调用DefaultTreeModel.insertNodeInto()来添加新节点。