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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при заполнении JTable, ошибка при заполнении JTable 
:(
    Опции темы
Alexander06
Дата 10.4.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

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



В приложении заполняю таблицу JTable в соответствии с содержимым массива объектов arrBasics.
Делает это функция updateBasicsTable(). Определенная последовательность действий вызывает исключение.

1) Вызываем функцию updateBasicsTable при пустом массиве arrBasics. Таблица пуста, заголовки столбцов присутствуют, все ок.

2) Добавляем элемент в arrBasics.

3) Вызываем функцию updateBasicsTable. 

4) В функции при вызове tableBasisc.setModel(dataModel); переходим к переопределенной мною функции getColumnClass прежней модели.
Прежней, потому что возникает исключение "Exception occurred during event dispatching: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0"
в строке returnValue = getValueAt(0, column).getClass();
Ведь, раз в прежней модели не было данных, обращаться к 0-й строке не получиться. Прежняя модель должна как-то деактивироваться?

вот функция заполнения таблицы

Код

    private void updateBasicsTable(){
        
        // Модель столбцов
        DefaultTableColumnModel colModel = new DefaultTableColumnModel();
        colModel.addColumn(new TableColumn());
        colModel.addColumn(new TableColumn());
        colModel.addColumn(new TableColumn());
        
        colModel.getColumn(0).setHeaderValue("№");
        colModel.getColumn(0).setModelIndex(0);
        colModel.getColumn(0).setMinWidth(40);
        colModel.getColumn(0).setMaxWidth(40);
        colModel.getColumn(0).setResizable(false);

        colModel.getColumn(1).setHeaderValue("Лемма");
        colModel.getColumn(1).setModelIndex(1);
        colModel.getColumn(1).setMinWidth(100);
        colModel.getColumn(1).setMaxWidth(100);
        colModel.getColumn(1).setResizable(false);

        colModel.getColumn(2).setHeaderValue("Метка");
        colModel.getColumn(2).setMinWidth(100);
        colModel.getColumn(2).setModelIndex(2);
        colModel.getColumn(2).setResizable(true);
        
        // Создание модели данных
        DefaultTableModel dataModel = new DefaultTableModel(0,3) {
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
            @Override
             public Class getColumnClass(int column) {
               Class returnValue;
               if ((column >= 0) && (column < getColumnCount())) {
                
                // Далее происходит исключение

                 returnValue = getValueAt(0, column).getClass();
               } else {
                 returnValue = Object.class;
               }
               return returnValue;
             }
        };
        
        // Заполнение модели данных
        int i = 0;
        String baseName, label;
        for(basicClass base: arrBasics){
            Vector vct = new Vector(3);
            vct.add(0, String.valueOf(i+1));
            baseName = base.getName();
            label    = base.getLabel();
            if(baseName==null) baseName = new String();
            if(label   ==null) label    = new String();
            vct.add(1, baseName);
            vct.add(2, label);
            dataModel.addRow(vct);
            i++;
        }

        // Привязка к таблице
        tableBasisc.setModel(dataModel);
        RowSorter<TableModel> sorter =
                              new TableRowSorter<TableModel>(dataModel);
        tableBasisc.setRowSorter(sorter);
        tableBasisc.setColumnModel(colModel);
        tableBasisc.doLayout();
    }


Возможно, есть способ не формировать всю модель данных заново, но мне хотелось бы понять в чем ошибка здесь. Подскажите , что я упускаю в своем коде.  
Спасибо.

Это сообщение отредактировал(а) Alexander06 - 10.4.2009, 15:30
PM MAIL   Вверх
Alexander06
Дата 10.4.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

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



решил проблему с исключением, переопределив getColumnClass

Код

DefaultTableModel dataModel = new DefaultTableModel(0,3) {
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
            @Override
            public Class getColumnClass(int column) {
                Class returnValue;
                switch (column){
                    case 0: returnValue = Integer.class.getClass();
                    case 1: returnValue = String.class.getClass();
                    case 2: returnValue = String.class.getClass();
                    default: returnValue = Object.class;
                }
                return returnValue;
            }
        };


но все равно не ясно как быть, если я не знаю заранее типы данных в таблице или не хочу переписывать эту функцию для каждой таблицы.
PM MAIL   Вверх
aleksandy
Дата 15.4.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 1
Всего: 5



Насколько я могу судить твой метод getColumnClass(int column) ВСЕГДА будет возвращать Object.class.
Для правильной работы нужно либо вставить break-и или сделать так:
Код

            @Override
            public Class getColumnClass(int column) {
                switch (column){
                    case 0: return Integer.class;
                    case 1: return String.class;
                    case 2: return String.class;
                    default: return Object.class;
                }
            }

PM   Вверх
math64
Дата 15.4.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Второй вариант будет всегда возвращать Class.class (кроме варианта default).
Первый вариант не работает если в таблице нет данных.
И не всегда getColumnClass() должен возвращать класс помещённых в колонке данных: иногда нужно вернуть Icon.class, а класс данных будет ImageIcon или другой класс, реализующий интерфейс Icon.
Код

  Class[] colunmClasses;
  public setColumnClasses(Class[] colunmClasses) {
     this.colunmClasses = colunmClasses;
  }

  @Override
  public Class getColumnClass(int column) {
     if (comumn < 0 || column >= columnClasses.length)
       return Object.class;
     else
       return columnClasses[column];
  }


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

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

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


 




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


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

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