Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (27)


Как скрыть/восстановить столбец в JTable?..

Поиск:
Не так давно на форуме промелькнул вопрос о том, как можно скрыть столбцы в JTable. В ответ предлагалось использовать removeColumn(). Однако, в таком случае довольно затруднительно обратно показать те столбцы, что были скрыты. Информация из сети и мудрые люди натолкули меня на довольно изящное, как мне кажется, решение - поработать с TableModel. Ведь именно там хранятся данные и там описываются методы доступа к ним.
В итоге, получилось так:
В класса TableModel будем хранить не только сами данные и заголовки, но и некий объект содержащий список видимых столбцов. У меня - это вектор, хотя можно использовать все, что душе угодно. Индекс эл-та вектора - номер ОТОБРАЖАЕМОГО столбца, а значение - индекс "постоянного" столбца таблицы. А потом переопределим методы получения данных из модели.
..Н-да.. Туманно объяснил.. Лучше на примере. Я взял стандартный сановский пример и чуток подкорректировал его.

Итак, создаем нашу TableModel:
Код

..
class MyTableModel extends AbstractTableModel {

//это наши заголоки:
       final String[] columnNames = {"First Name",
                                     "Last Name",
                                     "Sport",
                                     "# of Years",
                                     "Vegetarian"};

//данные таблицы:
       final Object[][] data = {
           {"Mary", "Campione",
            "Snowboarding", new Integer(5), new Boolean(false)},
           {"Alison", "Huml",
            "Rowing", new Integer(3), new Boolean(true)},
           {"Kathy", "Walrath",
            "Chasing toddlers", new Integer(2), new Boolean(false)},
           {"Sharon", "Zakhour",
            "Speed reading", new Integer(20), new Boolean(true)},
           {"Angela", "Lih",
            "Teaching high school", new Integer(4), new Boolean(false)}
       };

//вектор видимых столбцов:
       Vector visible_columns;

//конструктор:
       MyTableModel(){
 //здесь мы создаем наш вектор и заполняем его начальными значениями.
           visible_columns = new Vector();
           for (int i=0; i<columnNames.length; i++){
                  visible_columns.add(new Integer(i));
           }

       }
..


А теперь переопределим основные методы:
Код

..
     public int getColumnCount() { //получаем кол-во ВИДИМЫХ столбцов
           return visible_columns.size();
       }

..

       public String getColumnName(int col) { //получаем заголовок
           //для этого с помощь вектора видимых столбцов получаем номер столбца,
   // к-й надо отобразить
           int true_column = ((Integer)visible_columns.get(col)).intValue();
           return columnNames[true_column];
       }

       public Object getValueAt(int row, int col) {
    //аналогично getColumnName
           int true_column = ((Integer)visible_columns.get(col)).intValue();
           return data[row][true_column];
       }
..

Далее можно определить методы сокрытия/восстановления столбцов. Возможно, я зря использовал Vector, может, с другими классами было бы легче - ну, воля ваша. Я написал метод turnOffColumn(), к-й скрывает i-й столбец (где i - индекс столбца в "статичном" массиве столбцов. Он не зависит от кол-ва видимых колонок!) , и метод resetColumns() - он восстанавливает видимтость всех столбцов.
Можно было бы написать метод восстановления конкретного столбца, но при решении моей задачи это было не нужно. :)
Итак, вот код этих методов. Он не представляет особой сложности:
Код

..
public void turnOffColumn(int col) {
       Integer intCol = new Integer(col);
       int i=visible_columns.indexOf(intCol);
       if(i!=-1){
            visible_columns.remove(i);
       };
       fireTableStructureChanged();
   }

   public void resetColumns(){
       visible_columns.clear();
       for (int i=0; i<columnNames.length; i++){
                  visible_columns.add(new Integer(i));
       };
        fireTableStructureChanged();
   }
..


Вот, собственно, и все. Прелесть моего решения - нет зависимости от отображаемых столбцов и кроме того, можно легко восстановить скрытые колонки.
Итак, я прикрепляю архив с исходником работающего примера - можно брать и компилить. В коде я по кнопке удаляю/восстанавливаю 2-й и 4-й столбцы.
Enjoy it.

HideColumnTable.zip
Автор: Kurt






Просмотров: 3571

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную