Построение JTree с бесконечной глубиной

#java #swing #data-structures #jtree

#java #swing #структуры данных #jtree

Вопрос:

Если я не знаю, какова глубина JTree, какую логику я могу использовать для построения JTree. В моей базе данных есть таблица категорий с родительской категорией и дочерним элементом внутри дочернего элемента и так далее. Я хочу построить JTree с этими данными. Можете ли вы дать мне несколько идей о том, как это сделать? Ниже приведена моя структура базы данных.
введите описание изображения здесь

Ответ №1:

Реализуйте свой собственный, TreeNode который заполняет свой список дочерних узлов ad-hoc (с помощью запроса к БД) при открытии узла (т. Е. при первом вызове children() or getChildCount() ) вместо того, чтобы заранее создавать дерево DefaultMutableTreeNode s.

Также смотрите Руководство по Java по этой теме. В разделе Как лениво загружать дочерние элементы показан другой подход с использованием TreeWillExpandListener s и подробного раздела здесь

Комментарии:

1. Как мне получить путь, когда я нажимаю на маленький в JTree. Это дает мне нулевое значение, когда я нажимаю на tat, потому что путь не выбран. Я хочу заполнить дочерний элемент при нажатии на этот . Есть идея?

Ответ №2:

Вызов JTree.addTreeExpansionListener позволяет добавить TreeExpansionListener, который обеспечивает событие, вызываемое TreeExpansionEvent при вызове одного из его методов. Вызов getPath этого события сообщит вам, где вы находитесь.

Кстати, если вы строите дерево «на лету», для начала вам нужны дескрипторы . Это означает, что когда вы помещаете узел в дерево, вы должны поместить дочерний элемент искусственного узла под ним. Когда вы получаете событие расширения дерева, посмотрите, является ли этот дочерний узел одним из этих искусственных узлов, и если это так, то удалите его и замените настоящими дочерними узлами (на основе запроса к БД).

Что такое искусственный узел? Просто класс, который реализует TreeNode, который каким-то образом отличается от ваших обычных TreeNode, который вы можете легко определить, что это такое.

Комментарии:

1. но в любом случае я добавляю дочерний узел с именем «Добавить», чтобы при нажатии на tat открывалось диалоговое окно и добавлялся узел к нему. Так должен ли я добавлять искусственный узел в этом случае? И у меня есть одна проблема с добавлением узлов. Когда я добавляю узел с помощью диалогового окна, я не вижу изменений, даже если я удалил весь дочерний узел и добавил его снова. в чем может быть проблема?

2. Узел добавления в данном случае является искусственным узлом. При добавлении узла вам, вероятно, придется запустить событие, представляющее изменение, например DefaultTreeModel.fireTreeNodesInserted(Object source, Object[] path, int[] childIndices, Object[] children)