Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Проблема с выводом строк таблицы


Автор: erslgoeirjh 09.11.07, 10:13
Есть таблица jTable1. Она определена в начале программы как табица из 24 строк и 6 столбцов:
Object[][] data = {{"...",...,"..."},{"...",...,"..."},...,{"...",...,"..."}};
Object[] columnnames = {"...","...","...","...","...","..."};
JTable jTable1 = JTable(data, columnnames);
Есть myTableModel, определённая как
DefaultTableModel myTableModel = (DefaultTableModel)jTable1.getModel();
С помощью функции myTableModel.insertRow() в таблицу вставляется новая строка, так, что реально число строк в таблице становится больше 24. Таблица помещена в ScrollPane.

Но после этого добавления строк в таблицу при прокрутке в ScrollPane показываются всё равно только первые 24 строк таблицы. Как сделать, чтобы при прокрутке показывались все строки таблицы?

Автор: Alien 09.11.07, 11:04
После добавления данных в таблицу вызывай метод обновления данных fireTableDataChanged()

Автор: wind 09.11.07, 11:31
Цитата Alien @
После добавления данных в таблицу вызывай метод обновления данных fireTableDataChanged()

При использовании DefaultTableModel заботиться об уведомлении таблицы не нужно.

erslgoeirjh, код в студию.

Автор: erslgoeirjh 09.11.07, 12:32
Цитата wind @
При использовании DefaultTableModel заботиться об уведомлении таблицы не нужно.

erslgoeirjh, код в студию.

На самом деле у меня вместо DefaultTableModel используется некая MyTableModel, являющаяся потомком DefaultTableModel. В ней я переопределил метод isCellEditable.

Вот код:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    MyTableModel myTM;
    jTable1.setModel(myTM);
     
    //...
     
    int rowscount = myTM.getRowsCount();
    int currow = 0;
    InputStream fileIn = FileInputStream(filename); // filename -- некоторое имя файла
    byte buff = new byte[79];
    while (fileIn.read(buff)!=-1) {
      if (currow>=rowscount) {
        Object obj = {"","","","","",""};
        myTM.insertRow(currow, obj);
        rowscount = myTM.getRowCount();
      }
      s = new String(buff);
      // обработка строки s
      myTM.setValueAt(s1, currow, 2); // s1 -- некоторая подстрока из строки s
      // ...
      currow++;
    }


Метод fireTableDataChanged() не помогает.

Автор: Grab[SSAU] 09.11.07, 12:36
Цитата erslgoeirjh @
На самом деле у меня вместо DefaultTableModel используется некая MyTableModel, являющаяся потомком DefaultTableModel. В ней я переопределил метод isCellEditable.


при использовании конструктора a-la:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    JTable jTable1 = JTable(data, columnnames);


создается объект
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DefaultTableModel
.

Я немного не понимаю, как тогда все работает ;) Можно выложить весь код?

Автор: wind 09.11.07, 13:26
Цитата Grab[SSAU] @
Можно выложить весь код?

Если кода очень много, прикрепите его к сообщению в виде архива.

Автор: Alien 09.11.07, 13:51
erslgoeirjh, ты изменяешь количество строк в модели. После того, как добавил строку методом myTM.setRowCount(...) укажи, сколько стало строк в модели.

А вообще, лучше бы запихнул данные в конструктор DefaultTableModel и это добавил в таблицу. Потом спокойно себе добавляешь и тд.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Object[][] data = {{"1", "2"}};
    Object[] column = {"3", "4"};
    DefaultTableModel d = new DefaultTableModel(data, column);
    JTable table = new JTable(d);
    JScrollPane sp = new JScrollPane(table);
    Object[] dat = {"3", "4"};
    d.insertRow(1, dat);
    add(sp);

Автор: erslgoeirjh 15.11.07, 08:54
Проблема решена!

У JTable есть свойство preferredSize и есть соответствующие функции getPreferredSIze и setPreferredSize. Их и надо использовать для задания количества строк, которые прокручиваются JScrollPane-ом. Строке в таблице у меня соответствуют 16 пикселей.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)