You are not logged in.

  • Login

1

Monday, April 28th 2008, 3:35pm

JTable mit Daten aus der Datenbank neu zeichnen

Ich möchte nach einer Datenbankabfrage eine Tabelle neu darstellen. Einen Kunden kann ich löschen/hinzufügen, dann jedoch funktioniert das neu zeichnen nicht mehr.

Die Tabelle befindet sich auf einem Panel:

Source code

1
2
3
panelTableKunden.add(tableKunden); 
this.add(labelTabelleKunden, "1,23,5,23"); 
this.add(new JScrollPane(panelTableKunden), "1,25,5,45");


Hat jemand eine bessere Idee als,

Tabelle löschen:

Source code

1
panelTableKunden.removeAll();

Und dann Tabelle mit neuen Daten neu zeichnen:


Source code

1
2
3
panelTableKunden.add(tableKunden); 
this.add(new JScrollPane(panelTableKunden), "1,25,5,45"); 
panelTableKunden.revalidate();

2

Monday, April 28th 2008, 10:32pm

Moin,

erstmal rein zum Verständnis:

Willst Du die Tabelle selbst neu zeichnen?

oder

Willst Du den Inhalt der Tabelle aktualisieren?

Für den zweiten Fall rate ich Dir zu einem TableModel (rate ich in letzter Zeit recht oft *g*).

Gruß,
Puni

3

Monday, April 28th 2008, 10:49pm

möchte den Inhalt der Tabelle aktualisieren

Benutze folgenden Code:

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public void erstellenTabelleKunden() { 
 
try { 
// Treiber bekannt machen 
Class.forName("com.mysql.jdbc.Driver"); 
} 
catch (ClassNotFoundException e) { 
e.printStackTrace(); 
System.exit(1); 
} 
 
try { 
// Verbindung zur Datenbank herstellen 
con = DriverManager.getConnection("jdbc:mysql://localhost/dvdverleih", 
username, password); 
stmt = con.createStatement(); 
 
tableKunden = new JTable(); 
String[] tblHead = {"Kunden Nr.","Vorname","Nachname","Strasse", 
"Strassen Nr.","PLZ","Ort"}; 
JTableHeader th = tableKunden.getTableHeader(); 
 
ResultSet datenMenge; 
datenMenge = stmt.executeQuery("SELECT kunden_id,vorname,nachname," + 
"strasse,strassen_nr,plz,ort FROM kunden"); 
 
DefaultTableModel aModel = (DefaultTableModel)tableKunden.getModel(); 
aModel.setColumnIdentifiers(tblHead); 
 
ResultSetMetaData rsmd = datenMenge.getMetaData(); 
int colNo = rsmd.getColumnCount(); 
 
while(datenMenge.next()) { 
Object[] objects = new Object[colNo]; 
 
for(int i=0 ; i<colNo ; i++) { 
objects[i] = datenMenge.getObject(i + 1); 
} 
aModel.addRow(objects); 
} 
 
tableKunden.setModel(aModel); 
tableKunden.setEnabled(false); 
 
// nach dem zweiten Durchgang Panel frisch aufsetzen 
if(kontrolleRepaint > 0) { 
panelTableKunden.add(tableKunden); 
this.add(new JScrollPane(panelTableKunden), "1,25,5,45"); 
panelTableKunden.revalidate(); 
} 
kontrolleRepaint++; 
System.out.println("kontrolleRepaint: " + kontrolleRepaint); 
} 
catch(SQLException e) { 
//Fehlermeldung angeben 
System.out.println("\n Fehler: Sql-Abfrage \n"); 
e.printStackTrace(); 
return; 
} 
}

4

Wednesday, April 30th 2008, 8:54am

Moin,

also was Du absolut nicht machen brauchst, ist irgendwas zu repainten oder die Panels neu einzufügen.
Das DefaultTableModel welches Du verwendest, beinhaltet fire-Methoden, die aufgerufen werden können, sobald die Tabelle verändert wird.

Zum Beispiel:
Du fügst eine neue Zeile hinzu, danach kommt die fire-Methode:

Source code

1
aModel.fireTableDataChanged();


Das sollte ohne Probleme funktionieren.

Gruß,
Puni

Similar threads

Social bookmarks