Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > неправильно происходит редактир-е строки в JTable


Автор: Adept 8.1.2005, 14:39
Попал в новую яму smile уже с редактированием.
Второй раз строка в JTable нередактируется, т.е первый раз проходит все нормально, а если попытатся этуже строку отредактировать еще раз вылетает ошибка
Код

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mobiltrade.MainFrame.buttonEdit_actionPerformed(MainFrame.java:452)
at mobiltrade.MainFrame.access$200(MainFrame.java:32)


Вот моя структура:
БД -> MobilTableModel -> SorterTableModel -> JTable

Вот тут выскакивает ошибка
Код

private void buttonEdit_actionPerformed(ActionEvent e) {
     ..........
     String sMobilIDEdit  = sorterTableModel.getValueAt(tablePrihod.getSelectedRow(), sorterTableModel.getColumnCount() - 1).toString(); //тут sMobilIDEdit становится равным null
     ..........      
}


Вот тут вызывается метод редактирования
Код

Object[] insertTable = new Object[5];
insertTable[0] = convertDateDBApp(valueData.getText());
insertTable[1] = valueModel.getSelectedItem();
insertTable[2] = valueImei.getText();
insertTable[3] = valueProdavec.getSelectedItem();
insertTable[4] = Integer.parseInt(valueCenaZakup.getText());
stm.EditRow(tableRowSelect,insertTable);
//где stm - это обьект SorterTableModel



Вот SorterTableModel

Код

public class SorterTableModel extends AbstractTableModel {
   private Row[] rows;
   private MobilTableModel model;
   int sortColumn;

   public SorterTableModel(MobilTableModel m) {
       model = m;
       rows = new Row[model.getRowCount()];
       for (int i = 0; i < rows.length; i++) {
           rows[i] = new Row();
           rows[i].index = i;
       }
   }
   public void sort(int c) {
       sortColumn = c;
       Arrays.sort(rows);
   }
   public Object getValueAt(int r, int c) {
       return model.getValueAt(rows[r].index, c);
   }
   public int getRowCount() {
       return model.getRowCount();
   }
   public int getColumnCount() {
       return model.getColumnCount();
   }
   public String getColumnName(int c) {
       return model.getColumnName(c);
   }
   private class Row implements Comparable {
       public int index;
       public int compareTo(Object other) {
           Row otherRow = (Row) other;
           Object a = model.getValueAt(index, sortColumn);
           Object b = model.getValueAt(otherRow.index, sortColumn);
           if (a instanceof Comparable) {
               return ((Comparable) a).compareTo(b);
           } else {
               return a.toString().compareTo(b.toString());
           }
       }
   }
   public void EditRow(int r,Object[] rowData){
      model.EditRow(rows[r].index,rowData);
      fireTableRowsUpdated(r,r);
      //fireTableDataChanged();
   }
}



Вот ModelTableModel
Код

public class MobilTableModel extends AbstractTableModel {
   int columnCount;
   ResultSetMetaData rsMetaData;
   String[] columnNameEng;
   Object[] row;
   String temp = "";
   Vector rows = new Vector();
   Connection conn;
   ResultSet rs;
   public MobilTableModel(Connection conn, ResultSet rs) {
       try {
           this.conn = conn;
           this.rs = rs;
           rsMetaData = rs.getMetaData();
           columnCount = rsMetaData.getColumnCount();
           columnNameEng = new String[columnCount];
           for (int i = 1; i < columnCount + 1; i++) {
                columnNameEng[i - 1] = rsMetaData.getColumnName(i).trim();
           }
           while (rs.next()) {
               row = new Object[columnCount];
               for (int y = 1; y < columnCount + 1; y++) {
                   String colType = rsMetaData.getColumnTypeName(y);
                   if (colType.equals("INTEGER")) {
                       row[y - 1] = new Integer(rs.getInt(y));
                   } else {
                       if (colType.equals("DATETIME")) {
                           row[y - 1] = rs.getDate(y);
                       } else {
                           row[y - 1] = rs.getString(y);
                       }
                   }
               }
               rows.addElement(row);
           }
       } catch (SQLException sqle2) {
       } catch (NullPointerException npe) {
       }

   }
   public int getRowCount() {
       return rows.size();
   }

   public int getColumnCount() {
       return columnCount;
   }
   public String getColumnName(int column) {
       return (columnNameEng[column]);
   }
   public Object[] getRow(int index) {
       return ((Object[]) rows.elementAt(index));
   }
   public Object getValueAt(int row, int column) {
       return ((Object[]) rows.elementAt(row))[column];
   }
   public void EditRow(int row, Object[] rowData){
       rows.setElementAt(rowData,row);
       fireTableRowsUpdated(row,row);
       //fireTableDataChanged();
   }

}




Автор: Domestic Cat 8.1.2005, 22:17
Цитата(Adept @ 8.1.2005, 05:39)
Второй раз строка в JTable нередактируется, т.е первый раз проходит все нормально, а если попытатся этуже строку отредактировать еще раз вылетает ошибка


То есть, подряд нажать кнопку редактирования?

Кстати проверяй, выделен ли ряд в таблице, иначе getSelectedRow вернет -1 и будет нехорошо.

Автор: Adept 9.1.2005, 11:27
У меня по нажатию кнопки Edit выскакивает окно в котором я редактирую данные, там есть кнопка ок. После нажатия которой это окно закрывается и мы возвращаемся в главное окно, там где находится таблица(уже с изменениями).
Вот если уже отредактированную строку попробывать опять по кнопке Edit отредактировать, то при нажатии кнопки Edit окно редактирования непоявляется, а выскакивает эта ошибка.
Я так понимаю что тут неможет получить значение.
String sMobilIDEdit = sorterTableModel.getValueAt(tablePrihod.getSelectedRow(), sorterTableModel.getColumnCount() - 1).toString(); //второй раз вместо значения sMobilIDEdit = null

Автор: Adept 9.1.2005, 12:16
Проверку на выделение ряда я делаю.
Тут даже если написать так
Код

sMobilIDEdit = sorterTableModel.getValueAt(0,5).toString();
             

все равно ошибку выбрасывает


Автор: igon 9.1.2005, 17:28
Код

Object[] insertTable = new Object[5];
insertTable[0] = convertDateDBApp(valueData.getText());
insertTable[1] = valueModel.getSelectedItem();
insertTable[2] = valueImei.getText();
insertTable[3] = valueProdavec.getSelectedItem();
insertTable[4] = Integer.parseInt(valueCenaZakup.getText());
stm.EditRow(tableRowSelect,insertTable);

Т.е. столбцов - 5, индекс последнего - 4. Вполне естественно, что
Код

getValueAt(0,5)

не сработает

Может, изначально у тебя 6 столбцов, а ты после редактирования делаешь их число равным 5 в редактированной строке?

Автор: Domestic Cat 9.1.2005, 18:46

Цитата(igon @ 9.1.2005, 08:28)
Т.е. столбцов - 5, индекс последнего - 4. Вполне естественно, что
Код

getValueAt(0,5)

не сработает

Там бедь стоит sorterTableModel.getColumnCount() - 1, должно работать.; а вот
Цитата(Adept @ 9.1.2005, 03:16)

sMobilIDEdit = sorterTableModel.getValueAt(0,5).toString();


даст ошибку.

Попробуй выводить значения всех параметров для sMobilIDEdit в консоль, посмотри чем они отличаются.

Автор: igon 9.1.2005, 19:21
sorterTableModel.getColumnCount(), возможно, возвращает 6.
Adept совершенно правильно (вручную) отнимает 1, получает 5 и ...получает ошибку smile

Автор: Domestic Cat 9.1.2005, 19:30
Тут без него не выяснишь smile

Автор: igon 10.1.2005, 00:10
А пока Adept отдыхает, у меня oftop предлжение - может, предложить вопрошающим (в рубрике "Прежде чем") постить минимальное приложение(2-3 урезанных донельзя классов), в которых, тем не менее, возникает волнующая их ошибка. Тогда мы могли бы просто пробежаться по нему debug'ом, особо не теряясь в догадках, как сейчас, например

Автор: Domestic Cat 10.1.2005, 00:26
И кому будет охота урезать классы smile

Автор: igon 10.1.2005, 00:42
Тогда пусть ждут, пока догадаемся smile
Хотя декомпозиция - один из основных методов отладки сколько-нибудь сложных программ. И как можно без него обойтись - я, например, не представляю. Разве что постить вопрос после первой неудачной компиляции smile

Автор: Adept 10.1.2005, 10:35
В SorterTableModel у меня находится все 6 столбцов.
6-й столбец (mobil_id)
В JTable я вывожу 5 столбцов (все кроме 6-го)
................................все понял блин моя невнимательность
спасибо люди навели на ошибку smile
я недобавил значение последнего столбца
insertTable[5] = "0";

Добавлено @ 10:39
точнее не insertTable[5] = "0";
а insertTable[5] = "нужное значение";
Еще раз спасибо за помощь smile

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