![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Привет всем!
Подскажите пожайлуста как целиком загнать деревовидную структуру из БД в элемент JTree. Заранее спасибо. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
НУ вот для примера: http://vingrad.ru/JAVA-JAV-000114
И вот еще: http://vingrad.ru/JAVA-JAV-002895 А считывание базы можно посмотреть в книжках. Для примера можно заглянуть сюда http://vingrad.ru/JAVA-JAV-000098 Если будут вопросы - задавай. Без обид - если у кого-то будет пример - дадут. Но если нет - то возможно надо будет прикладывать усилия. Задача требует некоторого времени и оно у многих здесь ценно. Удачи. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Надо писать вручную, стандартных способов маппиннга дерева из базы на объект, думаю, нет. У Оракла на уровне PL/SQL есть какие-то дополнения для работы с древесными структурами, но JDBCшный драйвер, по-моему, ничего такого не предусматривает.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Допустим есть база такой структуры:
Как мне считывать записи? Допустим, буду считывать по одной записе //============================================// Считываю первую запись 1 МСКИТ 0 Добавляю в дерево, далее пишу запрос по поиску дочерних записей,получаю след.: 3 Лекция№1 1 4 Лекция№2 1 Добавляю в дерево (Родитель ParentID=1) //============================================// Далее, считываю 2-ю запись 6 ТПР 0 Добавляю в дерево, пишу запрос по поиску дочерних записей,получаю след.: 7 Лекция№1 6 Добавляю в дерево (Родитель ParentID=6) //============================================// Далее, считываю 3-ю запись 3 Лекция№1 1 //============================================// Вот здесь начинается ступор.Запись не является корневой,значит родитель для этой записи уже занесен в дерево, необходимо найти родителя данной записи в дереве, но как... В базе данных я спокойно могу найти родителя текущей записи (1 МСКИТ 0).Название МСКИТ может встречаться несколько раз на разных уровнях, оно не является уникальным. Наверное надо где-то хранить вместе с названием узла Идентификатор и Родитель узла. Да... наверное плохой алгоритм Совсем запутался. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Алгоритм такой (для классической структуры хранения дерева):
Это сообщение отредактировал(а) LSD - 24.12.2005, 11:47 -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Добавлю: если количество данных невелико, то лучше считать все разом в память, и производить все перечисленные LSD операции на объектами в памяти.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Всем добрый вечер.
Вот написал кое-что, но почему-то не работает Итак вот урезанный код:
Вообщем проблема как я понял с удалением дочерних эл-ов из узла. Я раскрываю узел, дочерние элементы удаляются нужные элементы из базы данных добавляются, если я попытаюсь свернуть этот узел, то он не сворачивается, попробовал закоментирвать строку удаления "model.removeNodeFromParent((MutableTreeNode)selectNode1.children().nextElement());" узел открывается и закрывается нормально.В чем же проблема? |
|||
|
||||
| Гость_serge |
|
|||
|
Unregistered |
Проще использовать собственную TreeModel. Данные можно хранить в HashTable и/или WeakHashTable. Если данные в база данных не меняются, элементы свернутых узлов можно не удалять
|
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Неужели через DefaultTreeModel не покатит? Может все таки можно как-то исправить?
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Дай полный тестовый пример, который можно было бы запустить (включая таблицы). Потому что по этому куску кода я не вижу ошибок.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Sherst |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Струтктура InterBase:
NodeID NodeName ParentID Хранимые процедуры:
Текст программы:
|
||||||
|
|||||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
Сократил код как смог:
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
1. Ты используешь TreeExpansionListener, который срабатывает после того как ветвь будет раскрыта. Если ты хочешь получать событие до того как ветвь будет раскрыта, то надо использовать TreeWillExpandListener
2. Удалть всех потомков можно DefaultMutableTreeNode.removeAllChildren() 3. Работать через листенеров не очень хорошо, лучше написать свою модель TreeModel, которая будет работать с БД, и установить ее в дерево. Вот пример реализации для твоего случая:
от процедур я отказался, т.к. лень было разбираться как из процедуры вернуть курсор. И обновление для модели не действует (если поменять данные в БД, то они обновтся только после перезапуска). Чтобы они начали работать, надо или добавить свой TreeWillExpandListener, и на treeWillCollapse() вызывать fireTreeStructureChanged(). Или более предпочтительный вариант, это использовать event alerters InterBase-а. Вот что я получил в итоге: Это сообщение отредактировал(а) LSD - 1.1.2006, 22:44 Присоединённый файл ( Кол-во скачиваний: 28 )
DBTree.gif 8,73 Kb-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Sherst |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 26.10.2005 Репутация: нет Всего: 2 |
to LSD
Спасибо. Буду разбираться. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |