JTable neue Zeile einfügen

AlexD1979

Erfahrenes Mitglied
Folgendes Problem habe ich:
Ich lasse eine Tabelle per JDBC aus Oracle einlesen und als JTable ausgeben.. gut und schön...
nun möchte ich einen Datensatz an diese Tabelle anfügen
a) Wie bekommt man es hin auf Knopfdruck eine neue Zeile anzufügen
b) Wie kann man die Änderungen in der JTable an die Datenbank per Knopfdruck zurück geben?

c) Das Löschen möchte ich durch eine Änderung eines Feldes in der Datenbank erreichen das durch einen Knopfdruck auf meintestwegen 0 gesetzt wird und später bei dem SELECT ausgeschlossen wird!
 
Hi

zu a)

Schau dir das mal an:

Code:
class MyTableModel extends DefaultTableModel{

MyTableModel(Object[][] dataIn, Object[] columnIn){
      super(dataIn, columnIn);
}

public Class getColumnClass(int c){
      return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col){
//Denke daran, as die Zellenaddressen konstant sind
//egal, wo die Zellen auf dem Bildschirm erscheinen

if (col < 1){
    return false;
} else {
     return true;
       }
   }
...
}

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.addRow(...);

Das sollte funzen ...

zu b und c überleg ich mir nochwas...

P.s.: Was meinst du mit "Per Knopfdruck"?, hast du nen JButton oder willst du das mit Klick auf die Zelle in der JTable erledigt haben...?

Gruss Tom
 
Danke für deinen Tipp ich werde mich gleich dran machen und versuchen das umzusetzen....

Zu dem Buttonklick, also es sei mir gleich wie man dsa am elegantesten Lösen könnte.. ob man einen Button hat der für "speichern" steht oder das ein Eventlistener aufpasst wenn ich die Eingabezeile verlasse, oder Automatisch eine Speicehrung alle x Sekunden vornehmen lasse... die Variante mit dem Button scheint mir noch am plausibelsten.. ich poste dir mal meinen Quelltext zu dem Thema

// Einlesen der JTable für Mengen Panel 1

try {
// SQL-Select-Befehl

sql = "SELECT * FROM MENGEN";
stmt = con.createStatement();
result = stmt.executeQuery(sql);

ResultSetMetaData metaData = result.getMetaData();
int numberOfColumns = metaData.getColumnCount();
Vector columnNames = new Vector();
//for (int column = 0; column < numberOfColumns; column++) {
// columnNames.addElement(metaData.getColumnLabel(column + 1));
//}
columnNames.addElement("Monat");
columnNames.addElement("Menge");
columnNames.addElement("Produkt");
columnNames.addElement("Variante");

//Alle Reihen einlesen
Vector rows = new Vector();
while (result.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
newRow.addElement(result.getObject(i));
}
rows.addElement(newRow);
}
result.close();
stmt.close();
tabelle = new JTable(rows, columnNames);
tabelle.getTableHeader().setReorderingAllowed(false);

} catch (SQLException e) {
System.out.println("FEHLER");
}

JScrollPane jsp = new JScrollPane(tabelle);
pan1.add(jsp, BorderLayout.CENTER);

JButton but_akt_p1 = new JButton("Aktualisieren");
JButton but_neu_p1 = new JButton("Neuer Datensatz");
JButton but_del_p1 = new JButton("Löschen");

Box box1 = Box.createHorizontalBox();

box1.add(but_akt_p1);
box1.add(but_neu_p1);
box1.add(but_del_p1);

but_neu_p1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {

}
});

pan1.add(box1, BorderLayout.SOUTH);
 
Zu b)
Zugriff bekommt mann mit
JTable.getValueAt(int row, int cell);

z.b Zugriff auf Ausgewählte reihe.
String a = (String)table.getValueAt(table.getSelectedRow(),1);

Würde das Speichern direct an einem einem Event festmachen.

Zum Speichern ansich:
Nutz JDBC kram mal ein paar threads hier da habe ich ein beispiel mit JDBC gegeben.
Mit diesem Beispiel sollte auch C) kein PRoblem sein
 
Zurück