Мне действительно нужна ваша помощь ... Я уже отчаялся, потому что обновление JTable не работает должным образом.Java JTable RowSorter исключает исключение
У меня есть JTable, который получает свои данные из базы данных через mySQl. Я храню данные в массиве и передаю его в таблицуModel. После пожара «fireTableDatachanged» я вижу все данные. Это также работает при удалении строки: Я просто удаляю запись в своей базе данных и считываю новые данные из БД.
Итак, вот что странно: иногда это работает, а иногда нет ... Я также использую RowSorter, и это может быть актуальной проблемой.
Я очень благодарен за вашу помощь и благодарю заранее!
Это код для удаления и освежающим таблицы данных:
//////////////////////////////////////////////////////////////
// delete entry ButtonListener
//////////////////////////////////////////////////////////////
loeschen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// get database object
Datenbank db = new Datenbank();
// get selected row
int row = table.getSelectedRow();
int col = 0;
if (row != -1) {
row = table.convertRowIndexToModel(row);
Object entryname = model.getValueAt(row, col);
db.connect();
db.deleteEntry("reb", "belegnummer", entryname.toString());
db.close();
// delete documents from ftp server as well....
// ......
refreshTable();
}
});
}
/////////////////////////////////////////////////////////////////
// refresh table
// //////////////////////////////////////////////////////////////
public static void refreshTable() {
String query = "SELECT * FROM reb where projectname like '" + year
+ "%' order by projectname";
Datenbank db = new Datenbank();
db.connect();
data = db.getBills(query);
db.close();
model = new DefaultTableModel(data, tableHeader) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table.setModel(model);
model.fireTableDataChanged();
table.setRowSorter(sorter);
sorter.setModel(model);;
}
это метод, когда первый создал JTable
public void getBills() {
String query = "SELECT * FROM reb where projektname like '" + year
+ "%' order by projektname";
Datenbank db = new Datenbank();
db.connect();
data = db.getBills(query);
db.close();
model = new DefaultTableModel(data, tableHeader) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(model);
sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
}
здесь исключение
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
at javax.swing.JTable.convertRowIndexToModel(Unknown Source)
at buchungen.Overview$3.valueChanged(Overview.java:230)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(Unknown Source)
at javax.swing.DefaultListSelectionModel.clearSelection(Unknown Source)
at javax.swing.JTable.clearSelection(Unknown Source)
at javax.swing.JTable.clearSelectionAndLeadAnchor(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.JTable.setModel(Unknown Source)
at buchungen.Overview.refreshTable(Overview.java:501)
at buchungen.Overview$4.actionPerformed(Overview.java:456)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
ну все, любые предложения здесь будут о догадываясь, для лучшей помощи скорее опубликовать SSCCE, короткий, работоспособный, компилируемая с жестко запрограммированным значением для TableModel, позволяет избежать любых исключений, возникающих из JDBC, FTP и т. д. – mKorbel
, но все остальное работает просто отлично. программа генерирует исключение в 'table.setModel (model);'. Я просто не знаю, какой массив вне границ, потому что массив «данные» содержит все нужные данные из базы данных при отладке. – GeoGecco
_Sometimes_ звучит как некорректная синхронизация; см. [* Начальные темы *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod