![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Kurt |
|
||||||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Не так давно на форуме промелькнул вопрос о том, как можно скрыть столбцы в JTable. В ответ предлагалось использовать removeColumn(). Однако, в таком случае довольно затруднительно обратно показать те столбцы, что были скрыты. Информация из сети и мудрые люди натолкули меня на довольно изящное, как мне кажется, решение - поработать с TableModel. Ведь именно там хранятся данные и там описываются методы доступа к ним.
В итоге, получилось так: В класса TableModel будем хранить не только сами данные и заголовки, но и некий объект содержащий список видимых столбцов. У меня - это вектор, хотя можно использовать все, что душе угодно. Индекс эл-та вектора - номер ОТОБРАЖАЕМОГО столбца, а значение - индекс "постоянного" столбца таблицы. А потом переопределим методы получения данных из модели. ..Н-да.. Туманно объяснил.. Лучше на примере. Я взял стандартный сановский пример и чуток подкорректировал его. Итак, создаем нашу TableModel:
А теперь переопределим основные методы:
Далее можно определить методы сокрытия/восстановления столбцов. Возможно, я зря использовал Vector, может, с другими классами было бы легче - ну, воля ваша. Я написал метод turnOffColumn(), к-й скрывает i-й столбец (где i - индекс столбца в "статичном" массиве столбцов. Он не зависит от кол-ва видимых колонок!) , и метод resetColumns() - он восстанавливает видимтость всех столбцов. Можно было бы написать метод восстановления конкретного столбца, но при решении моей задачи это было не нужно. ![]() Итак, вот код этих методов. Он не представляет особой сложности:
Вот, собственно, и все. Прелесть моего решения - нет зависимости от отображаемых столбцов и кроме того, можно легко восстановить скрытые колонки. Повторюсь, мысль применить такой способ принадлежит не мне, я лишь реализовал. Кроме того, я практически не пишу на Java, поэтому не отрицаю, что мой код содержит множество неэффективных решений. Ну, по крайней мере, это работает. ![]() Итак, я прикрепляю авхив с исходником работающего примера - можно брать и компилить. Правда, пример реализован крайне убого, но ведь это не главное. ![]() .. Если мои усилия оказались полезными - можно кинуть в FAQ. ;) Присоединённый файл ( Кол-во скачиваний: 53 ) ![]() -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||||
|
|||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Попытался добавить в ФАК - как в пустоту кануло, ни ответа ни привета.
![]() -------------------- |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Сейчас попробую - подождите минутку.
Добавлено @ 19:45 Все нормально - можно наслаждаться ![]() Kurt - большое спасибо. |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
А почему у меня не сработало?
-------------------- |
|||
|
||||
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Рад, что понравилось.
![]() -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
А ты еще маленький ![]() ![]() Дозволения на такие штуки у тебя нет. |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Вроде ж в новостях Админ говорил что модератор раздела вносит статьи в ФАК.
-------------------- |
|||
|
||||
igon |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 7 Всего: 21 |
Решение, предлагаемое Kurt'ом, безусловно заслуживает права на существование как один из вариантов реализации сокрытия/восстановления столбцов в JTable, однако хотелось бы остановиться на некоторых моментах: 1. "Промелькнул" - это не то слово, которым можно описать наличие на форуме нескольких топиков с огромными кусками исходных текстов, инициатором которых был sanic ![]() 2. Использование removeColumn() без использования TableModel никогда не предлагалось, т.к. в исходной постановке задачи указывалось на необходимость манипуляций со скрытыми столбцами. 3. Для реализации функциональности, предлагаемой Kurt'ом (скрыть некоторые/показать все), нет необходимости в создании отдельного класса с дополнительными структурами и переопределением методов. Использование removeColumn() для сокрытия некоторых столбцов тривиально и в комментариях не нуждается. Отмечу только, что удаление столбца из JTable не сопровождается удалением его и из TableModel. Что же касается восстановления показа всех столбцов, то вот эскизный вариант реализации:
-------------------- Хотите поговорить об этом? |
||||
|
|||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Kurt реализовал MVC, это самый лучший вариант реализации; если учесть что в твоем примере создается лишний объект JTable ![]() -------------------- |
|||
|
||||
igon |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 30.10.2004 Репутация: 7 Всего: 21 |
И как именно Kurt реализовал часть V(View) MVC? ИМХО, мой лишний объект JTable и будет этим самым View ![]() В моем примере лишним является не объект JTable, а, возможно, его лишняя общая переинициализация из model с полным перечнем столбцов - Kurt это делает более локализованно. Но будут ли при этом накладные расходы очень ощутимы? Еще раз подчеркну - я не против создания и использования custom TableModel, но нужно ли, в случаях, подобных данному, ИМХО, излишнее усложнение? Domestic Cat,
относится к
![]() -------------------- Хотите поговорить об этом? |
||||||||
|
|||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Вариант не единственный.
А вообще это пример, а не только код для решения определенной задачи. Конечно, если бы нам было нужно только удалить пару столбцов и все, то нет проблем. Но на форум часто приходят новые люди и регулярно задается вопрос на который отвечают: создай модель тейбла. Так что пример это хороший. При написании кода хорошо оставлять "зацепки". Вот понадобится тебе отсортировать таблицу по к-л столбцу, и все равно придется добавлять модель. -------------------- |
|||
|
||||
JavaDell |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 11.5.2011 Репутация: нет Всего: нет |
С этим все понятно.
Но как быть, если данные в таблице динамически удаляются/появляются? Делаю как описано здесь: http://www.codeguru.com/java/articles/660.shtml только вместо статического массива данных обращаюсь к getDataVector() методу TableModel. В итоге getColumnCount() обрезает таблицу с конца и получаю array out of bounds после того, как прячу столбы. |
|||
|
||||
JavaDell |
|
||||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 11.5.2011 Репутация: нет Всего: нет |
Вопрос снят, если кто не хочет замарачиваться со всеми этими внутренностями, есть решение проще:
Спрятать:
Показать:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |