Необходимо ли вызывать nodeWereInserted() и аналогичные методы в DefaultTreeModel?

В DefaultTreeModel вы можете вставить узел, используя insertNodeInto() методы. Тем не менее, я заметил, что также существует nodesWereInserted() метод, который имеет этот очень краткий Javadoc:

Вызовите этот метод после того, как вы вставите несколько узлов дерева в узел.

Мне очень странно, что это публичный метод. Я ожидаю, что если бы он запускал ChangeEvents для слушателей, то это должен быть закрытый метод, который вызывается insertNodeInto(), Просто кажется, что вызов метода для уведомления об изменении, вызванного другим методом, несколько не согласуется с тем, как спроектирован Java Swing (я не называю elementIsInserted() метод, когда я добавляю элемент в JComboBox).

Но я обнаружил, что в моем коде не имеет значения, если я позвоню nodesWereInserted() после insertNodeInto(), В любом случае результаты получаются одинаковыми с добавлением узла в дерево и отображением в графическом интерфейсе.

Так может кто-то, пожалуйста, объясните, если это необходимо позвонить nodesWereInserted() а похожие методы в DefaultTreeModel? И если так, то почему? Что это делает insertNodeInto() не может сделать самостоятельно?

3 ответа

Решение

Вам не нужно называть это самостоятельно. Как сказал EJP, он вызывается каждый раз, когда вставляется узел. Вы можете переопределить эту функцию в своем производном классе, чтобы получить сигнал при вставке узла.

Если у вас нет собственного производного класса, просто добавьте TreeModellistener.

Представьте, что ваша TreeModel использует независимое реальное дерево и некоторые узлы вставляются отдельным процессом, который не знает о существующей модели. Или две TreeModels используют одно и то же дерево объектов (узлов). Процесс просто добавляет детей к некоторым узлам. Или вы вставляете узел в первую модель, но также должны обновить вторую.

Тогда вам как-то надо обновить модель. В этом случае вы используете nodesWereInserted() и вам нужен открытый метод для вызова извне модели.

Конечно, если вы звоните insertNodeInto() nodesWereInserted() называется внутри

У нас может быть свой собственный узел дерева, который выполняет некоторую обработку. (Скажем, мы хотим проверить, подходит ли новый узел для вставки.) Мы добавляем нового дочернего элемента в этот пользовательский узел дерева с помощью DefaultMutableTreeNode.insert()метод. На данный момент нам нужно сообщить модели о вставке, вызвав DefaultTreeModel.nodesWereInserted() метод. Если изменения слишком сложны, возможно, потребуется вызвать DefaultTreeModel.reload() метод. Если у нас нет собственной обработки в нашем собственном узле дерева, то мы можем просто добавить новый узел, вызвав DefaultTreeModel.insertNodeInto(),

Другие вопросы по тегам