![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
В Java не очень силен. Есть необходимость создать таблицу, содержащую многоуровневые данные (древовидную структуру), с возможностью скрытия и раскрытия информации нижних уровней. Для ясности привожу картинки:
Свернутый вариант: ![]() Развернутый вариант: ![]() Пока что смог организовать подобное расположение путем манипулирования запросов к базе данных и ручным расположением данных. В таком варианте отсутствует возможность сортировки, кроме того в одном столбце находятся данные разного типа, что тоже добавляет головной боли. Есть ли какие-либо стандартные средства решения подобной задачи? |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Посмотрите в этой демке компонент JXTreeTable.
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Похоже то что надо. Спасибо, буду разбираться...
|
|||
|
||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Удалось добиться вот такого результата:
![]() Пока тревожат две проблемы: Во-первых не могу вывести сетку таблицы в первой колонке. Во всех остальных отрисовываю в TableCellRenderer следующим образом :
Обработка первой колонки никаких результатов не дает, как будто она и не вызывается. Кто что может посоветовать? Во-вторых отсутствует возможность сортировки. Насколько я понял, ее нужно реализовывать самому? пока этим вопросом не занимался, но может кто сведущ в этом вопросе подскажет заранее, дабы сократить время моих мучений Надеюсь на вашу помощь) |
|||
|
||||
| jk1 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Border при этом совсем необязателен.
Там Renderer другой, от дерева. Устанавливается методом setTreeCellRenderer();
Стандартная сортировка, присутствующая в JTable в этом расширении отключена из-за неопределенности: в самом деле, что будет с деревом, если отсортировать последний столбец? -------------------- Opinions are like assholes — everybody has one |
||||||||
|
|||||||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Не срабатывает в данном случае. Первая колонка действительно обрабатывается setTreeCellRenderer(), пока не совсем все корректно, но думаю добью скоро. Спасибо за инфу. А по поводу сортировки: понятно, что сортировать разные типы данных нелогично, но мне это и не нужно. Нужна сортировка по значениям верхнего уровня дерева, а нижние чтобы за ними перескакивали. Я так понимаю это нужно делать сортировкой Nod`ов, наверное не так и сложно. У меня вопрос в том, как ловить щелчок мыши по заголовкам, чтобы его обрабатывать? Ну и желательно заголовки тоже перерисовывать в зависимости от выбранного типа сортировки (стрелочки там на них нарисовать) |
|||
|
||||
| jk1 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
это что касается щелчка мыши по заголовкам
Скорее всего виноват LAF, я попробовал - на дефолтном работает. Либо Вы что-то совсем перемудрили в margin'ами или рендерерами, что они просто затирают линии. Вот пример на котором я тестил:
Есть еще вероятность того, что в вашем случае сетка отрисовывается, но белого цвета. Лечится так:
Пожалуй, это самое разумное решение. Это удобно будет сделать в модели таблицы. -------------------- Opinions are like assholes — everybody has one |
||||||||||
|
|||||||||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Ваш пример у меня также отображается некорректно - сетка первой колонки не отрисовывается. setGridColor тоже не помогает. Делаю в Eclipse, Java 1.6 - в чем может быть проблема?
|
|||
|
||||
| bara |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Написано кривовато, но результат определенно есть) Выкладываю получившийся вариант, вдруг кому понадобиться:
Эти рендереры рисуют сетку и красят строки чет/нечет (пока без разбора где какой узел).
Сортировка происходит следующим образом (для данных типа String):
У меня 2 насущных вопроса: 1) как после сортировки отрисовать на заголовке соответствующего столбца стрелочку (или что-то подобное), чтобы наглядно было видно, какой столбец и в каком направлении отсортирован. 2) вопрос скорее по общему пониманию Java: сейчас таблица формируется методом getTable(). При ее изменении (например при сортировке), чтобы обновить отображаемый вид я удаляю из ScrollPane старую таблицу, формирую вызовом getTable() новую, и запихиваю ее обратно в ScrollPane. Если сделать собственный класс, экземпляром которого и будет таблица, как реализовать отображение ее обновленного состояния? |
||||
|
|||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Может не очень понятно объяснил. Суть вопроса вот в чем: я формирую таблицу следующим образом:
В классе MyTreeTable() описаны модель таблицы, рендереры и обработчики событий (сортировка). При клике на заголовке столбца изменяется дерево, на основе которого построена таблица, но перерисовка таблицы не происходит. Как выйти из ситуации?? Чувствую вопрос решается переписыванием каких-то методов, вроде repaint(), но пока ничего не получается((( |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Зря удаляете таблицу, по идеологии Swing MVC надо бы просто заменять модель у существующей.
А если непременно надо удалять и добавлять компоненты, когда форма уже видима, вызывайте revalidate() у контейнера после всех манипуляций с его содержимым. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| bara |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Спасибо огромное! Замена модели - вот что мне нужно было. Удаление таблицы была полумера, потому как не знал как по-другому. Теперь все работает.
|
|||
|
||||
![]()
|
| Правила форума "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. |