Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有必要在DefaultTreeModel中调用NodeWereInserted()和类似的方法?_Java_Swing_Defaulttreemodel - Fatal编程技术网

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

Java 是否有必要在DefaultTreeModel中调用NodeWereInserted()和类似的方法?,java,swing,defaulttreemodel,Java,Swing,Defaulttreemodel,在中,可以使用insertNodeInto()方法插入节点。但是,我注意到还有nodesWereInserted()方法,它有一个非常简洁的Javadoc: 在将一些树节点插入节点后调用此方法 我觉得很奇怪,这是一种公开的方法。我希望,如果它向侦听器触发ChangeEvents,那么它应该是由insertNodeInto()调用的私有方法。调用一个方法来通知另一个方法调用的更改似乎与Java Swing的设计方式有些不一致(当我向JComboBox添加元素时,我不会调用elementIsInse

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

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

我觉得很奇怪,这是一种公开的方法。我希望,如果它向侦听器触发ChangeEvents,那么它应该是由
insertNodeInto()
调用的私有方法。调用一个方法来通知另一个方法调用的更改似乎与Java Swing的设计方式有些不一致(当我向JComboBox添加元素时,我不会调用
elementIsInserted()
方法)

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


那么,有人能解释一下是否有必要在DefaultTreeModel中调用
NodeWereInserted()
和类似的方法吗?如果是,为什么?它做了什么,
insertNodeInto()
自己做不到的事情?

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

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


当然,如果您调用
insertNodeInto()
nodeswereinerted()
是在内部调用的

您不需要自己调用它。正如EJP所说,每次插入节点时都会调用它。 可以在派生类中重写此函数,以便在插入节点时收到信号


如果您没有自己的派生类,那么只需添加一个TreeModellistener

我们可以拥有自己的自定义树节点,该节点正在进行一些处理。(假设我们要检查新节点是否符合插入条件。) 我们使用
DefaultMutableTreeNode.insert()
方法。此时,我们需要通过
调用
DefaultTreeModel.nodesWereInserted()
方法。如果修改太复杂,可能需要调用
DefaultTreeModel.reload()
方法。 如果在我们自己的树节点中没有任何自定义处理,那么
可以通过调用
DefaultTreeModel.insertNodeInto()

添加一个新节点,正如Javadoc所说的
insertNodeInto()
调用
nodeswereinerted(),
很难理解为什么发生这种情况时你会感到惊讶。@EJP,看起来我当时有一个隧道视觉的案例。我非常专注于JavaDoc,我甚至没有考虑过我想调用的另一种方法。虽然我仍然不明白为什么
nodeswereinerted()
是一个公共方法,但是如果插入节点的唯一方法是使用
insertNodeInto()
。子类化可能吗?可能需要调用DefaultTreeModel.reload(),而不是使用适当的模型通知程序,而是取决于结构,因为可以创建一个ZOO