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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с таблицей через модель. Ранее обсуждалось с DarkDs 
:(
    Опции темы
Alone
Дата 15.1.2004, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Всем доброго дня.

Вот, дошли руки до реализации таблицы, у которой по ходу может меняться количество и содержание строк. (колонки - кол-во и их имена не затрагиваются) Просто будут вставляться и удаляться строки.

Так вот, было предложено ( (с)DarkDs) использовать свою модель таблицы и специальный для этого класс для описания массива данных для таблицы.

Собственно модель:
Код

public class MTableModel extends javax.swing.table.DefaultTableModel {
   
   /** Creates a new instance of MTableModel */
16    public MTableModel(  ) {
       }
   
   public int getRowCount() {
       // у меня будет 2 столбца
24        int count = rows.size();
       if ( count < 2 )   count = 2;
        return count;
   }
   
   public int getColumnCount() {
       return tableStorage.STORAGE_LENGHT;
   }
   
   public String getColumnName(int columnIndex) {
       return "";
   }
   
   public Class getColumnClass(int columnIndex) {
       return String.class;
   }
   
   public Object getValueAt(int rowIndex, int columnIndex) {
       int size = rows.size();
       if ( size == 0 || rowIndex >= size )
           return "";
       
       tableStorage row = (tableStorage)rows.get( rowIndex );
       if ( row == null || row.getData( columnIndex ) == null )
           return "";
       return row.getData( columnIndex );
   }
   
   public void addRow( tableStorage row ) {
       rows.add( row );
       fireTableRowsInserted( rows.size() - 1, rows.size() - 1 );
   }
   
   public void addRows( java.util.List newRows ) {
       rows.addAll( newRows );
       fireTableDataChanged();
   }

   // это дописано мной
   public void clear(){
       rows.clear();
       fireTableDataChanged();
   }
   
   private java.util.List rows= new java.util.LinkedList();
}



Класс для хранения данных
Код

public class tableStorage {
   
   /** Конструктор класса tableStorage
    * @param lenght Размерность объекта
    */
   public tableStorage() {
       data=new Object[STORAGE_LENGHT];
   }
   
   public Object getData( int index ) {
       if ( index >= STORAGE_LENGHT  )
           return null;
       return data[index];
   }
   
   public void setData( int index, Object value ) {
       if ( index >= STORAGE_LENGHT  )
           return;
       data[index] = value;
   }
   
   public static int STORAGE_LENGHT=2;
   private Object[] data;
}


Теперь самое интересное. Использование.
Код

19        tableModel1=new MTableModel();
20        remindTbl1=new javax.swing.JTable(tableModel1);


На строке 19 вылет с ошибкой:
Код

java.lang.NullPointerException
       at pbx.MTableModel.getRowCount(MTableModel.java:24)
       at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:194)
       at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:98)
       at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:80)
       at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:60)
       at pbx.MTableModel.<init>(MTableModel.java:16)
       at pbx.remind_tbl.<init>(remind_tbl.java:19)


До конца еще не разгреб, но похоже, что мне придется не наследовать DefaultTableModel, а имплементить интерфейс TableModel, реализовывая его под свою структуру данныхconfused.gif
Или я несу откровенный бред?



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 15.1.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Зачем? smile.gif
Просто если хочешь пользовать встроенный в Дефаулт табле модел механизм - нужно ее инициализировть вначале:
Код

  /** Creates a new instance of MTableModel */
public MTableModel(  ) {
   super()
}

Или есть другой вариант - держать свой контейнер (что по моему предпочтительнее):
Код

public class MTableModel extends javax.swing.table.DefaultTableModel {
   private ArrayList rows = new ArrayList();

   /** Creates a new instance of MTableModel */
   public MTableModel(  ) {
   }

PM MAIL   Вверх
Alone
Дата 15.1.2004, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

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



Дык! у меня так и сделано!!! Взгляни в конец кода MTableModel
Код

  private java.util.List rows= new java.util.LinkedList();
}



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
DarkDS
Дата 15.1.2004, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Сорри... smile.gif
Посмотрел тут код дефаулт дата модели - так там в констуркторе вызывается getRowCount.
То есть еще до инициализации rows.
Так что тут 2-а способа есть:
1. Наследовать все же от интерфейса ТаблеМодел.
2. Добавить проверку rows == null в getRowCount.
в случае 2 придется переопределить setValueAt() smile.gif
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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