Hallo,
ich nutze eine JTable mit einem TableModel, welches ein AbstractTableModel erweitert. Im Hintergrund läuft eine verschlüsselte HSQLDB im File-Modus.
Problem: Wenn ich in der setValueAt-Methode das ResultSet mit updateString update, und dann mit updateRow() in die Datenbank schreibe, wird zwar die Datenbank korrekt aktualisiert, aber das ResultSet enthält zu keinem Zeitpunkt sichtbar die Änderungen, was ich mit einem System.out.println nach dem updateString, aber vor und nach dem updateRow() überprüft habe. Dementsprechend ist natürlich auch die Änderung nicht in der JTable sichtbar.
Hier der Code des TableModels:
Bin dankbar für alle Tips und Hilfe!
ich nutze eine JTable mit einem TableModel, welches ein AbstractTableModel erweitert. Im Hintergrund läuft eine verschlüsselte HSQLDB im File-Modus.
Problem: Wenn ich in der setValueAt-Methode das ResultSet mit updateString update, und dann mit updateRow() in die Datenbank schreibe, wird zwar die Datenbank korrekt aktualisiert, aber das ResultSet enthält zu keinem Zeitpunkt sichtbar die Änderungen, was ich mit einem System.out.println nach dem updateString, aber vor und nach dem updateRow() überprüft habe. Dementsprechend ist natürlich auch die Änderung nicht in der JTable sichtbar.
Hier der Code des TableModels:
Java:
package model;
public class TutorTableModel extends AbstractTableModel {
public boolean conn = false;
private final String SQLSelect = "SELECT * FROM TUTOR;";
private Connection con;
private Statement stmt;
private ResultSet rsGUI;
private ResultSetMetaData rsmd;
DBProperties config = new DBProperties();
DefaultTableModel model;
public TutorTableModel() {
if (checkConnection()) {
conn = true;
}
}
public boolean checkConnection() {
try (Connection conTest = DriverManager.getConnection(config.getUrl(), config.getUserName(),config.getPassWord());
Statement stmtTest = conTest.createStatement(); ResultSet rsTest = stmtTest.executeQuery(SQLSelect)) {
System.out.println("Verbindung zur Datenbank wurde hergestellt.");
return true;
} catch (SQLException e) {
System.out.println("Die Verbindung zur Datenbank konnte nicht hergestellt werden!");
return false;
}
}
public void init() {
closeConnections();
try {
con = DriverManager.getConnection(config.getUrl(), config.getUserName(), config.getPassWord());
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rsGUI = stmt.executeQuery(SQLSelect);
rsmd = rsGUI.getMetaData();
} catch (SQLException e) {
System.out.println("Fehler beim Initialisieren der Tabelle.");
}
}
// Alle Zellen sind editierbar.
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public int getRowCount() {
try {
rsGUI.last();
return rsGUI.getRow();
} catch (SQLException e) {
return 0;
}
}
@Override
public int getColumnCount() {
try {
return rsmd.getColumnCount();
} catch (SQLException e) {
return 0;
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
try {
rsGUI.absolute(rowIndex + 1);
return rsGUI.getObject(columnIndex + 1);
} catch (SQLException e) {
return 0;
}
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
try{
if (!aValue.equals(null)) {
rsGUI.absolute(rowIndex+1);
rsGUI.updateString(columnIndex+1, aValue.toString());
System.out.println(rsGUI.getString(columnIndex+1));
rsGUI.updateRow();
System.out.println(rsGUI.getString(columnIndex+1));
this.fireTableCellUpdated(rowIndex, columnIndex);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public String getColumnName(int columnIndex) {
try {
return rsmd.getColumnName(columnIndex + 1);
} catch (SQLException e) {
return super.getColumnName(columnIndex);
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
try {
return Class.forName(rsmd.getColumnClassName(columnIndex + 1));
} catch (SQLException e) {
return super.getColumnClass(columnIndex);
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
}
public void closeConnections() {
if (rsGUI != null) {try {rsGUI.close();} catch (SQLException ex) { }}
if (stmt != null) {try {stmt.close();} catch (SQLException ex) {}}
if (con != null) {try {con.close();} catch (SQLException ex) {}}
}
}
Bin dankbar für alle Tips und Hilfe!