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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как впихнуть данные в созданный пустой jTable ? 
:(
    Опции темы
Alone
Дата 7.8.2003, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Имеем
javax.swing.JTable refTbl;
...
refTbl.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null},
{null, null, null, null, null}
}, итд...

В общем на экране есть таблица 10Х5

Далее , путем шаманских танцев с бубном вокруг сокета, получили набитый по уши Vector
Каждый элемент вектора массив из 5 элементов.
Вопрос: Как впихнуть в таблицу например первые 10 элементов из вектораconfused.gif
Пытался делать что то наподобие :

Код

public void fillTable(int page, java.util.Vector aArray) {
 // page - номер страницы
               // из массива aArray

 Object curRow=new java.lang.reflect.Array[5]; // сюда ложится элемент из вектора
 
 if(aArray.size()>0){
  pageCount=aArray.size()/10;
 
  refTbl.removeRowSelectionInterval(0, 9); // очищаем таблицу
 
  for(int k=page*10; k<page*10+10; k++) // цикл на 10 итераций (10 строк в таблице)
  {
        curRow=aArray.get(k);  // достаем из вектора N-й элемент, который является массивов 1Х5
   
   for(int i=0; i<5; i++){
    refTbl.setValueAt(curRow[i], k, i );
                                        // по идее должны поэлементно заполнить строку из таблицы, ан нет...
   }
  }
 }
 
}

получаем ошибку
array required, but java.lang.Object found
refTbl.setValueAt(curRow[i], k, i );




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

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


Account removed
***


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

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



Может дело в этом объявлении
Object curRow=new java.lang.reflect.Array[5];
Здесь curRow объявлен массивом из пяти эллементов типа Array (а не Object). А тебе нужен массив объектов а не массив массивов. Поэтому и компилятор ругается. Тебе наверно лучше использовать что-то вроде
Object[] curRow = new Object[5];

Это сообщение отредактировал(а) Sun - 7.8.2003, 18:44


--------------------
Account removed
PM MAIL   Вверх
DarkDS
Дата 7.8.2003, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все делается намного проще smile.gif)) Через датамодель... Погоди часика полтора - до дому доберусь выложу...
PM MAIL   Вверх
Alone
Дата 7.8.2003, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если через датамодель, то насколько я понял это будет просто пересоздание таблицы, ток уже с новыми значениями ячеек?



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

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


Опытный
**


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

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



Не обязательно... В общем погодь чутка smile.gif

Это сообщение отредактировал(а) DarkDS - 7.8.2003, 18:59
PM MAIL   Вверх
Alone
Дата 7.8.2003, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ладно, жду smile.gif
а пока тут с примерами из постваки jdk поразбираюсь...



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

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


Опытный
**


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

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



Кстати... Вопрос... А не проще ли передавать Вектор, хранящий в себе какой либо класс с данными (то есть уже упорядочить данные) smile.gif

Это сообщение отредактировал(а) DarkDS - 7.8.2003, 19:20
PM MAIL   Вверх
DarkDS
Дата 7.8.2003, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Итак: Пишем небольшой класс Модели... Примерно такой:
Код

import java.util.List;
import java.util.LinkedList;

import javax.swing.table.DefaultTableModel;

public class MTableModel extends DefaultTableModel {
private LinkedList rows = new LinkedList();

public int getRowCount() {
 int count = rows.size();
 if ( count < 10 )
  count = 10;
 return count;
}

public int getColumnCount() {
 return Storage.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 "";

 Storage row = (Storage)rows.get( rowIndex );
 if ( row == null || row.getData( columnIndex ) == null )
    return "";
 return row.getData( columnIndex );
}

public void addRow( Storage row ) {
 rows.addLast( row );
 fireTableRowsInserted( rows.size() - 1, rows.size() - 1 );
}

public void addRows( List newRows ) {
 rows.addAll( newRows );
 fireTableDataChanged();
}

public void clear() {
 rows.clear();
 fireTableDataChanged();
}
}

В данном случае я воспользовался для простоты работы классом Сторедж (чтобы не работать на прямую с массивом)
Код

public class Storage {
public static int STORAGE_LENGHT = 5;

private Object[] 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;
}
}


Как будет происходить в данном случае работа с данными:
Создается наша датамодель
Код

MTableModel model = new MTableModel();
JTable table = new JTable( model ); //(О таблице теперь можно забыть - все будет идти через модель...)

Теперь в месте где получаем лист (кстати. Лудше работать с листами чем с вектором. У них скорость доступа меньше) мы можем либо добавить какое то количество строк, либо весь вектор сразу...
Вот так:
Код

public void fillTable( List list ) {
 model.clear() //Если мы хотим очистить таблицу... Иначе этого не нужно.
 model.addRows( list ) //Если мы хотим добавить все данные в листе...
 //Иначе делаем так:
 /*
 Iterator iterator = rows.iterator(); //Для быстроты перебора воспользуемся итератором.
 //minItem i maxItem - индексы начала и конца страницы.
 while( iterator.hasNext() && i < maxItem ) {
   Storage storage = (Storage)iterator.next();
   if ( i >= minItem )
     model.addRow( storage );
   ++i;
 }
 */
}


Это сообщение отредактировал(а) DarkDS - 16.9.2003, 14:25
PM MAIL   Вверх
DarkDS
Дата 7.8.2003, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все понятно? Нужны пояснения?
ЗЫ. Сорри.. Чутка ошибся во времени пути до дому... Дела появились...

Это сообщение отредактировал(а) DarkDS - 7.8.2003, 22:45
PM MAIL   Вверх
Alone
Дата 7.8.2003, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да. Вопросы есть.
Код хороший, я понял его.
Только зачем наследовать целый класс? Почему нельзя использовать JTable?
В JTable я нашел метод, тот что мне надо: setValueAt(Object o, col, row);
Он бы меня вполне устроил.
Только вот, что за объект ему надо скормить для указанной ячейки?



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

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


Опытный
**


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

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



Вообще то нужно скормить обычный объект... А Наследовать целый класс - для простоты работы с содержимым таблицы. Тут ты можешь и имена столбцов выставить и если нужно чтобы данные редактировались - добавить 2-а метода и все (один метод показывает - редактируемая ли ячейка, а второй изменяет значени... Причем редактируемость можешь контролировать. К примеру сделать все столбцы кроме первого редактируемыми. И с данными тоже работать можешь как угодно smile.gif )...
Да к тому же более "кошерно" работать с моделью данных, а не с таблицей...
Тем более что таблица методом setValueAt(Object o, col, row); вызывает такой же метод у модели... И через таблицу напрямую столбец не добавишь. (в данном примере достаточно убрать if ( count < 10 )count = 10; и в начале таблица будет пустой, а после заполнения ее с помощю модели буду отображатся добавленные столбцы)

Это сообщение отредактировал(а) DarkDS - 8.8.2003, 10:33
PM MAIL   Вверх
Alone
Дата 8.8.2003, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



УгУ... Однако хорошо сказано! Убедил.
Таки с меня пиво... [(_)
И еше пиво... [(_)
smile.gif



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

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


Опытный
**


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

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



Кстати, а таблицу нужно лепить только на jScrollPanel? Или по барабану?
Если по барабану, то я не понял почему при добавлении таблицы на скроллпанель - имена столбцов есть, а если прилепить таблицу на JPanel, то она голая свсем...


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

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


Опытный
**


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

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



Все очень просто: Когда для показа столбцов реализован такой принцип, что заголовки показываются через специальный вьюпорт. В скрол панеле этот вьюпорт есть, а в обычной панеле нет. Так что лудше всего таблицу в скроле помещать... Если не нужно чтобы прокручивалось - поставь просто у скрола опцию NO_SCROLL smile.gif
PM MAIL   Вверх
Alone
Дата 8.8.2003, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это понятно. я уже так и сделал.
Тут в другом вопрос... sad.gif
Код

java.util.LinkedList list = new java.util.LinkedList();
String[] ls={"1", "Пупкин В", "24234", "345345", "45646"};

list.addFirst(ls);
       model.addRows(list);

что в этом неправильногоconfused.gif
потому что таблица не появилас, а в стдаут получено:
Код

java.lang.ClassCastException
       at pbx.mTableModel.getValueAt(mTableModel.java:63)
       at javax.swing.JTable.getValueAt(JTable.java:1760)
       at javax.swing.JTable.prepareRenderer(JTable.java:3686)
       at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:1149)
       at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1051)
       at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:974)
       at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
       at javax.swing.JComponent.paintComponent(JComponent.java:541)
       at javax.swing.JComponent.paint(JComponent.java:808)
       at javax.swing.JComponent.paintChildren(JComponent.java:647)
       at javax.swing.JComponent.paint(JComponent.java:817)
       at javax.swing.JViewport.paint(JViewport.java:707)
       at javax.swing.JComponent.paintChildren(JComponent.java:647)
       at javax.swing.JComponent.paint(JComponent.java:817)
       at javax.swing.JComponent.paintChildren(JComponent.java:647)
       at javax.swing.JComponent.paint(JComponent.java:817)
       at javax.swing.JComponent.paintChildren(JComponent.java:647)
       at javax.swing.JComponent.paint(JComponent.java:817)
       at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4771)
       at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4724)
       at javax.swing.JComponent._paintImmediately(JComponent.java:4668)
       at javax.swing.JComponent.paintImmediately(JComponent.java:4477)
       at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)
       at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)
       at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
       at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
       at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
       at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
       at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
       at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)



И еще: что бы выставить ширину стлобцов так как мне надо, мне пришлось сделать это
Код

int[] refColumnWidth = {30,170,10,10,10};
       javax.swing.table.TableColumnModel tModel = refTbl.getColumnModel();
       for (int i=0;i<5;i++)
       {
           tModel.getColumn(i).setPreferredWidth(refColumnWidth[i]);
       }

В принципе сработало, но хотелось бы мнение...

Это сообщение отредактировал(а) Alone - 8.8.2003, 15:26


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

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

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

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


 




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


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

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