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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перерисовка таблицы, перерисовывается после перезапуска 
:(
    Опции темы
Avtarkia
  Дата 18.11.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!
У меня возникла следующая проблема: таблица создается из бд с помощью самописной модели. Если пользователь добавляет новые данные(вводит и потом нажимает "добавить"), то при обработке нажатия на кнопку данные отсылаются в бд и вызывается initialize(), в котором прописана вся прорисовка(с получением данных из бд). БД сразу обновляется, а таблица - только после перезапуска.
ЗЫ:Видела вот тут, что для самописной модели нужен TableModelListener. Когда я пытаюсь его добавить к кнопке, эклипс ругается. Или его как-то надо по-хитрому описывать еще? smile Чего-то я не понимаю..
ЗЫЫ: setValueAt(...) в ActionPerformed также игнорится((
Код

private JButton getJButton(){
        if (jButton == null) {
            jButton = new JButton("Add");
        }
            jButton.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    if(dataIsSufficient(newName,newSurname)){
                        flag = true;
                        try{
                            sendNewData( newName, newSurname, newAddress, newPhone, newDay, newMonth, newTime, newPlace);
                            makeNull();
                            
                            getContData();//получение данных из бд
                            getMeetData();// -/-

                            jTableCont.fireTableRowsInserted(0, contDbSize-1);
                            jTableMeet.fireTableRowsInserted(0, meetDbSize-1);
                            
                            getJTable1();//ИГНОРИТ
                            getJTable2();//ИГНОРИТ
                            initialize();//ИГНОРИТ
                            repaint();//ИГНОРИТ
                            jTable1.setValueAt(newName,3,1);//ИГНОРИТ
                            
                        }catch(Exception ee){System.out.println("Error: " + ee.getMessage());}                    
                    }
                    repaint();//ИГНОРИТ

                }
            });
            
        return jButton;
    }
...
private JTable getJTable1() {
        
        if (jTable1 == null) {
            jTableCont = new MyTableModel(contCol, contDbSize, contColHeads, contactData, contactColEditable);
            jTable1 = new JTable(jTableCont);
            jTable1.setVisible(true);
            jTable1.setShowGrid(true);
        }
        return jTable1;
    }//getJTable2() аналогично

...
private void initialize() {
        this.setSize(600, 200);
        
        this.setContentPane(getJTabbedPane());//здесь кроется прорисовка
        this.setTitle("Organizer");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
        this.setVisible(true);
}


Это сообщение отредактировал(а) Avtarkia - 18.11.2008, 23:25
PM MAIL   Вверх
Connie
Дата 19.11.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В модели таблицы, после изменения данных нужно приписать одну из подходящих функций
http://java.sun.com/docs/books/tutorial/ui...table.html#fire

fireTableDataChanged(); например, если изменились все данные

Но тут нужно думать о том, что таблица, т.е. данные могут оказаться пустыми, в этом случае нужно палить 
fireTableRowsDeleted(n,m); с какой строки по какую удалились данные, ну как то так, если нужно, то вечером кину пример из своей модели

Но там не сложно, разберетесь.


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


Опытный
**


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

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



Вот как я делаю после перезагрузки данных
Код

 public void reloadProducts(int idGroup){
      int sz = products.size();
      products = new Vector(this.mgr.getProductsFromGroup(idGroup));
      
      if (products.size()>0) fireTableDataChanged();
      else if (sz>0) fireTableRowsDeleted(0,sz-1);
  }

Может и не верно, я сам с этим разбираюсь, так что вполне вероятно, что вариант не окончательный smile
PM MAIL WWW   Вверх
Avtarkia
Дата 22.11.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



что-то ничего не помогает((
с fireChange я пробовала уже. Единственное,меня немного смущает,что он вызывается для модели,а не самой таблицы... 
PM MAIL   Вверх
Connie
Дата 23.11.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

На прямую с моделью не стоит работать

JTable someTable = new JTable(new someModel());
в дальнейшем если нужен доступ к методам модели, то

((someModel)someTable.getModel()).someMetod(); //А вот внутри этого метода и палить, что данные изменились

Но я могу и ошибаться smile
PM MAIL WWW   Вверх
Avtarkia
Дата 23.11.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



То есть,грубо говоря, надо описать методы, с помощью которых обновляется таблица, прямо в описании модели? Или вообще переопределить fire для конкретного случая?
Вот вложенный класс для модели:
Код

class MyTableModel extends AbstractTableModel{
            
            Object[] colHeads;
            Object[][] data;
            int col, dbSize;
            boolean[] colEditable;
        
        public MyTableModel(int col0, int dbSize0, Object[] colHeads0, Object[][] data0, boolean[] colEditable0){
            
            col = col0;
            dbSize = dbSize0;
            colHeads = new Object[col];
            data = new Object[dbSize0][col];
            colEditable = new boolean[col];
            
            for(int p = 0; p < colHeads0.length; p++)
                colHeads[p] = colHeads0[p];
            for(int r = 0; r < dbSize; r++)
                for(int c = 0; c <  col; c++)
                    data[r][c] = data0[r][c];
            for(int h = 0; h < col; h++){
                colEditable[h] = colEditable0[h];
            }
        }

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


Опытный
**


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

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



Avtarkia, тут вот в чем дело

MyTableModel myModel = new MyTableModel();

MyTable myTable= new MyTable( myModel ); //Вот тут происходит копирование модели "внутрь" таблицы

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

А вот если вызвать этот метод так

((MyTableModel)myTable.getModel()).someMetod(); - тот тут уже вызывается та модель, что действительно связана с таблицей

Ведь в этом коде передается не указатель на модель таблицы
MyTable myTable= new MyTable( myModel );
А происходит копирование экземпляра класса. 

Цитата
То есть,грубо говоря, надо описать методы, с помощью которых обновляется таблица, прямо в описании модели?
Да


Код

class MyTableModel extends AbstractTableModel{
...
}

Внутри этого класса сделайте публичный метод, который бы обновлял данные (изменял их) а после этого вызывал соответствующий fire

Пример я приводил в своем коде

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


Новичок



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

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



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

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

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


 




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


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

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