# jTable mit Datenbankwerten befüllen



## Lia (27. Jun 2018)

Hi ihr Lieben,

ich habe Datenbank mit einer Tabelle und möchte diese Tabelle in ein jTable in Java mit allen Spalten und Zeilen füllen. "  String query =" SELECT * FROM lessons"; ".
Meinen jTable habe ich schon erstellt und es hat 5 Spalten. Ich habe dies versucht:

public Object getValueAt(int rowIndex, int columnIndex) throws SQLException {
     ResultSet rs = statement.executeQuery(query); 

   try {
             rs.absolute(rowIndex + 1);
             switch (columnIndex) {
                 case 0:
                     return rs.getString(1);
                 case 1:
                     return rs.getString(2);
                 case 2:
                     return rs.getInt(3);
                 case 3:
                 return rs.getObject(4).toString();
                 case 4:
                 return rs.getObject(5).toString();
                 default:
                     return null;
             }
         } catch (SQLException ex) {
             System.out.println(ex.getMessage());
..

Und dann die Funktion getValueAt() aufgerufen, aber das alles funktioniert leider nicht. 
Danke an alle.


----------



## mihe7 (27. Jun 2018)

Da es nicht erkennbar ist, ob Du JTable überschreibst, vorsichtshalber der Hinweis: mach das nicht, implementiere ein TableModel.

Unabhängig davon stimmt die Signatur nicht: getValueAt wirft keine SQLException. (EDIT: mit "getValueAt" war natürlich JTable#getValueAt bzw. TableModel#getValueAt gemeint)

Außerdem ist es äußerst ungünstig, Datenbankabfragen einfach so in getValueAt zu packen: die Methode wird für jede Zelle aufgerufen.


----------



## Lia (27. Jun 2018)

@mihe7 vielen Dank für deine Antwort !! Aber das TableModel habe ich schon implementiert, ich habe diese schon erstellt mit dem 

 table = new JTable();
  table.setModel(new DefaultTableModel(
   new Object[][] {
   },
   new String[] {
     "Lessons. Nr", "Name", "Number", "Call"
   }
  ));
  scrollPane.setViewportView(table);

oder wie genau meinst du das ? Ich habe nämlich mkit dem window builder die Tabelle "gebaut".
vielen dank


----------



## mihe7 (27. Jun 2018)

Wo kommt Deine getValueAt-Methode zum Einsatz?


----------



## Lia (27. Jun 2018)

in dem Button Click. Ich möchte alle Datensätze in dem jTable anzeigen nachdem der Benutzer auf "anzeigen" geklickt hat


----------



## mihe7 (27. Jun 2018)

Verstehe. Du rufst auf Klick Daten aus der DB ab und willst die JTable damit füllen. Das kann man machen, wenn die Tabelle relativ klein ist.

Da Du ein DefaultTableModel verwendest, sollte es in etwa so funktionieren (Pseudo-Code):


```
Vector rowData() throws SQLException {
    try(ResultSet rs = statement.executeQuery(query)) {
        Vector data = new Vector();
        while (rs.next()) {
            Vector row = new Vector();
            row.add(rs.getString(1));
            row.add(rs.getString(2));
            row.add(rs.getInt(3));
            ...
            data.add(row);
        }
        return data;
    }
}
Vector columnData() {
    return new Vector(Arrays.asList("Lessons. Nr", "Name", "Number", "Call"));
}

void reload() {
    DefaultTableModel model = (DefaultTableModel) jTable.getModel();
    model.setDataVector(rowData(), columnData());
}
```


----------



## Lia (27. Jun 2018)

vielen Dank!!

was wäre wenn es doch mhrere Datensätze gibt? oder was meinst du mit wenn die Tabelle klein ist ?


----------



## mihe7 (27. Jun 2018)

Naja, mit der Methode lädst Du alle Datensätze in den Speicher - egal, ob sie angezeigt werden oder nicht. JTable zeigt in der Regel also nur einen Ausschnitt der Daten an. JTable weiß, welche Zeilen und Spalten gerade angezeigt werden müssen und fragt das TableModel via getValueAt(row, col) genau danach. Dein getValueAt() entspricht genau diesem Ansatz, wenn Du es in eine von AbstractTableModel abgleitete Klasse steckst. Das Hauptproblem dabei ist, dass Du die Abfrage jedesmal durchführst, wenn JTable nach einem Wert einer Zelle fragt.


----------

