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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не сохраняются изменения в ячейке JTable 
V
    Опции темы
kaa
Дата 9.1.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток!

Есть такая проблема: не могу изменить значение в ячейке таблицы. 

Тоесть: я делаю двойной клик на ячейке - она переходит в режим редактирования; изменяю данные и нажимаю Enter (или убираю фокус с 
данной строки) - в ячейке что было до редактирования то и остаётся.

Код класса модели:
Код

class MyTableModel extends AbstractTableModel{

    private ResultSet rs;
    private ResultSetMetaData rsmt;

    private MyFrame frame;
    
    private Object retObj;
    
    public MyTableModel(JFrame param){
        frame = (MyFrame)param;
        try{
            rs = frame.rs;
            rsmt = rs.getMetaData();
        }
        catch(Exception e){
            e.printStackTrace();
            System.exit(-1);
        }
    }
    
    public int getRowCount(){
        int count = 0;
        try{
            rs.last();
            count = rs.getRow();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return count;
    }
    
    public int getColumnCount(){
        int count = 0;
        try{
            count = rsmt.getColumnCount();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return count;
    }
    
    public Object getValueAt(int row, int column){
        retObj = null;
        try{
            frame.rs.absolute(row+1);
            retObj = rs.getObject(column+1);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        return retObj;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        try{
            rs.absolute(rowIndex);
            rs.updateObject(columnIndex, aValue);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public Class getColumnClass(int c) {
        Class cl = null;
        try{
            cl = Class.forName(rsmt.getColumnClassName(c+1));
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        return cl;
    }

    @Override
    public boolean isCellEditable(int row, int col){
        return true;
    }

}


Код инициализации таблицы в конструкторе окна:
Код

tbl = new JTable();
tbl.setAutoCreateRowSorter(true);
tbl.setModel(new DefaultTableModel());
tbl.setFillsViewportHeight(true);
tbl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);


MyModelTable назначается таблице в обработчике события клика кнопки - думаю его приводить не стоит.

Собстно вот... :(

Это сообщение отредактировал(а) kaa - 9.1.2009, 17:26
PM MAIL   Вверх
Connie
Дата 9.1.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kaa, попробуйте так
Код

@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        try{
            rs.absolute(rowIndex);
            rs.updateObject(columnIndex, aValue);
        }
        catch(Exception e){
            e.printStackTrace();
        }
     fireTableCellUpdated(row, col);
    }
иксепшены не бросаются? данные в БД меняются?
PM MAIL WWW   Вверх
kaa
Дата 10.1.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Connie
Ексэпшены не бросаются, данные в БД не меняются, сейчас попробую.

Добавлено через 5 минут и 30 секунд
То же самое  :(

Может я где какое событие не обрабатываю?

В программе я не обрабатываю ни одного события от таблицы.

Это сообщение отредактировал(а) kaa - 10.1.2009, 01:48
PM MAIL   Вверх
Connie
Дата 10.1.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kaa, а можно сделать вывод чего передается функции setValueAt?

Код

@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
       System.out.println("Value="+aValue);
        try{
            rs.absolute(rowIndex);
            rs.updateObject(columnIndex, aValue);
        }
        catch(Exception e){
            e.printStackTrace();
        }
     fireTableCellUpdated(row, col);
    }

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


Опытный
**


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

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



Передает изменённое значение

Код

run:
Value=136+44524524546


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


Опытный
**


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

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



kaa, а чего это за плюс? Или тип значения строка?

Я сделал немного другой вывод
Код

System.out.println(aValue+" class="+aValue.getClass().getCanonicalName());

соответственно для целого поля вывод следующий
Код

22 class=java.lang.Integer

Если класс значения верный, то проверьте как работает
Код

rs.absolute(rowIndex);
            rs.updateObject(columnIndex, aValue);
где нибудь назначьте изменение БД на кнопку и фиксированное значение, т.к. если значения передаются в aValue верное, то оно должно присваиваться, если нет, значит rs.update не фурычит

Это сообщение отредактировал(а) Connie - 10.1.2009, 18:30
PM MAIL WWW   Вверх
kaa
Дата 10.1.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тип значения строка, ага... :(
PM MAIL   Вверх
kaa
Дата 10.1.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Jxtym cnhfyyj xnj byntuth

PM MAIL   Вверх
kaa
Дата 10.1.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поигрался с функцией.

Типы данных для столбца определяются правильно.

Код

@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        
        try{
            rs.absolute(rowIndex+1);
            System.out.println(aValue);
            rs.updateObject(columnIndex+1, aValue);
            System.out.println(rs.getObject(columnIndex+1));
            fireTableCellUpdated(rowIndex+1, columnIndex+1);
            rs.updateRow();

        }
        catch(Exception e){
            e.printStackTrace();
        }
    }


Тупит функция updateObject :(

Значение приходит правильное, но в ResultSet не сохраняется
Код

run:
1364546
136+4546



Это сообщение отредактировал(а) kaa - 10.1.2009, 22:24
PM MAIL   Вверх
math64
Дата 10.1.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Какая база данных, какой версии? Может она не умеет выполнять updateObject() и нужно выполнять обычный UPDATE а затем делать повторный SELECT?
PM   Вверх
skif18
  Дата 12.1.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 358
Регистрация: 17.5.2007
Где: Молдова, Кишинев

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



math64, согласен. скорее всего дело в базе. У меня код заработал. Все ОК. Как надо. 


--------------------

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


Опытный
**


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

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



math64
MySQL, то ли 5.0, то ли 5.1, точно вечером гляну.

Видимо упустил это в документации, я думал данные команды обобщенные для любого JDBC драйвера.
PM MAIL   Вверх
kaa
Дата 12.1.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MySQL 5.0.18-nt
PM MAIL   Вверх
kaa
Дата 13.1.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поборол я таки проблему smile

Код

@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex){
        try{
            rs.absolute(rowIndex+1);
            rs.updateObject((columnIndex+1), aValue);
            rs.updateRow();
            fireTableCellUpdated(rowIndex+1, columnIndex+1);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }


Я честно говоря так и не понял что ж я сделал что б работало smile

По видимому нельзя не только сдвигать курсор, до выполнения  rs.updateRow(), но и пытаться что-то прочитать из ResultSet-а без утери изменений.

Кстати, при работе с таблицами в UTF-8 есть неприятная бага вплодь до MySQL-5.0.24 кажись.

Подробнее тут


Это сообщение отредактировал(а) kaa - 13.1.2009, 22:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0874 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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