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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление строк в JTable 
:(
    Опции темы
fath_fast
Дата 22.3.2008, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ПОнимаю, что проблема изъезжена до дыр... но как нистранно она у меня всё-так возникла...
Есть своя модель таблицы:
Код

 public class table_models extends AbstractTableModel//   DefaultTableModel 
 {

    private ResultSet rs;
    private ResultSetMetaData rsm;
    private String[] ColNames;
    
    public table_models(ResultSet rs, String[] ColNames) {
        try {
            this.rs = rs;
            this.rsm = rs.getMetaData();
            this.ColNames=ColNames;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public Object getValueAt(int r, int c) {
        try {
           
            rs.absolute(r+1);
            return   rs.getObject(c+1);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
  
    @Override
      public void setValueAt(Object val, int r, int c) {
        
            // r=val;
          try {
         //     rs.move
         // rs.updateString(c, val.toString());
              rs.absolute(r+1);
              rs.updateString(c+1, val.toString());
              
              //      fireTableDataChanged();
          //    fireTableRowsUpdated(r, r);
              
              
         } catch (Exception ex) {
            ex.printStackTrace();
          }
            
       
    }
    
    public int getRowCount() {
        try {
            rs.last();
            return rs.getRow();
        } catch (Exception ex) {
            ex.printStackTrace();
            return 0;
        }
    }
  

    public int getColumnCount() {
        try {
            return rsm.getColumnCount();
        } catch (Exception ex) {
            ex.printStackTrace();
            return 0;
        }
    }
    @Override
    public String getColumnName(int c)
    {
        return ColNames[c].toString();
    }
    /*
    @Override
    public void addRow(Object[] data)
    {
        super.addRow(data);
    }
    */
    @Override
    public int findColumn(String nam)
    {
        int n = -1;
        for(int i=0; i < this.getColumnCount(); i++)
        {
            if(this.getColumnName(i)==nam)
            {
                n=i;
                break;
            }   
        }
        return n;
    }
    
    
    @Override
    public boolean isCellEditable(int r, int c)
    {
        return c==0||c==1||c==2;
    }
  
}


ТАк же есть обыкновенная таблица, которая имеет моделью выше приведённый код...
ПРоблема в том, что не могу никак при нажатии на кнопку вставить строку в таблицу...
НАсколько  я понимаю нужно написать собственный метод addRow... 
1) я прав?
2) если да, подскажите каким образом он должен выглядеть... 

P.S.:  Залез в код DefaultTableModel...Там работа идёт с Vektor, у меня ResultSet, кроме как вызова rs.insertRow() в методе
в собственном методе addRow() - вариантов больше никаких не возникает... 

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


Бывалый
*


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

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



в принципе проблема решена.... модель пришлось перевести на отображения не ResultSet, а Vector... 
единственная проблема: при следующей реализации addRow
Код

  public void addRow(Vector data)
    {
      //  super.addRow(data);
        try {
       
            vec.setSize(getRowCount()+1);
            vec.setElementAt(new Vector(), getRowCount()-1);
            ((Vector)vec.elementAt(getRowCount()-1)).setSize(getColumnCount());
          //    fireTableRowsUpdated(r, r);
    //         fireTableRowsInserted(getRowCount(), getRowCount());
              
         } catch (Exception ex) {
            ex.printStackTrace();
          }
    }

Столбец добавляется, но становится виден, только после того как изменятся размеры окна...  Можно как нибудь обновить таблицу безе перересовки всего фрейма? 
PM MAIL   Вверх
powerOn
Дата 23.3.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



вызывай fireTableDataChanged(); после добавления строки.


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Бывалый
*


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

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



powerOn, да давать комнду листнеру прийдётся...
Только вот загвоздка в чём:
Таблица работает с таблцей из БД, котрая имеет очень простую структуру:
id - Автоматический инткремент
name - само имя...

Так вот при нажатии кнопки "добавить" вызывается как и положено addRow:
Код

 public void addRow(Vector data)    
    {
      //  super.addRow(data);
        try {
       
            vec.setSize(getRowCount()+1);
            vec.setElementAt(new Vector(), getRowCount()-1);
            ((Vector)vec.elementAt(getRowCount()-1)).setSize(getColumnCount());
             fireTableRowsInserted(getRowCount()-1, getRowCount()-1);
        }
        catch (Exception ex) {
            ex.printStackTrace();
          }
    }

Листнер этого события выглядит так:
Код

 public void tableChanged(TableModelEvent ev) {
      
        switch (ev.getType()) {


            case TableModelEvent.UPDATE:
                for (int i = ev.getFirstRow(); i < ev.getLastRow() + 1; i++) {
                    Connect.getQuery("UPDATE store SET name='" + tab.getValueAt(i, 1).toString() + "' WHERE id='" + tab.getValueAt(i, 0).toString() + "'", false);    
                }

                break;

            case TableModelEvent.INSERT:



                for (int i = ev.getFirstRow(); i <= ev.getLastRow(); i++) {
                    Connect.getQuery("INSERT INTO store(name)  VALUES('')", false);  // здесь он в таблицу вставляет пустую строку
                }

                break;
            case TableModelEvent.DELETE:



                for (int i = ev.getFirstRow(); i < ev.getLastRow() + 1; i++) {
                    Connect.getQuery("DELETE FROM store  WHERE id='" + tab.getValueAt(i, 0).toString() + "'", false);
                }

                break;
        }

Так вот после того как строка вставлена, не отображается id в новой строке, из-за этого слетает обновление
Код

  Connect.getQuery("UPDATE store SET name='" + tab.getValueAt(i, 1).toString() + "' WHERE id='" + tab.getValueAt(i, 0).toString() + "'", false);   


Что подскажете, чтобы при вставке сразу обновлялась вся вставленная строка... Неужели заново делать запрос, и прикручивать модель?
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.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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