![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Kurt |
|
||||||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Не так давно на форуме промелькнул вопрос о том, как можно скрыть столбцы в JTable. В ответ предлагалось использовать removeColumn(). Однако, в таком случае довольно затруднительно обратно показать те столбцы, что были скрыты. Информация из сети и мудрые люди натолкули меня на довольно изящное, как мне кажется, решение - поработать с TableModel. Ведь именно там хранятся данные и там описываются методы доступа к ним.
В итоге, получилось так: В класса TableModel будем хранить не только сами данные и заголовки, но и некий объект содержащий список видимых столбцов. У меня - это вектор, хотя можно использовать все, что душе угодно. Индекс эл-та вектора - номер ОТОБРАЖАЕМОГО столбца, а значение - индекс "постоянного" столбца таблицы. А потом переопределим методы получения данных из модели. ..Н-да.. Туманно объяснил.. Лучше на примере. Я взял стандартный сановский пример и чуток подкорректировал его. Итак, создаем нашу TableModel:
А теперь переопределим основные методы:
Далее можно определить методы сокрытия/восстановления столбцов. Возможно, я зря использовал Vector, может, с другими классами было бы легче - ну, воля ваша. Я написал метод turnOffColumn(), к-й скрывает i-й столбец (где i - индекс столбца в "статичном" массиве столбцов. Он не зависит от кол-ва видимых колонок!) , и метод resetColumns() - он восстанавливает видимтость всех столбцов. Можно было бы написать метод восстановления конкретного столбца, но при решении моей задачи это было не нужно. Итак, вот код этих методов. Он не представляет особой сложности:
Вот, собственно, и все. Прелесть моего решения - нет зависимости от отображаемых столбцов и кроме того, можно легко восстановить скрытые колонки. Повторюсь, мысль применить такой способ принадлежит не мне, я лишь реализовал. Кроме того, я практически не пишу на Java, поэтому не отрицаю, что мой код содержит множество неэффективных решений. Ну, по крайней мере, это работает. Итак, я прикрепляю авхив с исходником работающего примера - можно брать и компилить. Правда, пример реализован крайне убого, но ведь это не главное. .. Если мои усилия оказались полезными - можно кинуть в FAQ. ;) Присоединённый файл ( Кол-во скачиваний: 53 )
HideColumnTable.zip-------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||||
|
|||||||
| 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. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |