Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как скрыть/восстановить столбец в JTable?.. 
:(
    Опции темы
Alex
Дата 6.1.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



Не так давно на форуме промелькнул вопрос о том, как можно скрыть столбцы в 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() - он восстанавливает видимтость всех столбцов.
Можно было бы написать метод восстановления конкретного столбца, но при решении моей задачи это было не нужно. smile
Итак, вот код этих методов. Он не представляет особой сложности:
Код

..
 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


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0774 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.