Swing JTable mit MySQL Datenbank

thet1983

Top Contributor
Hallo,
vorweg, hab einiges im Netz gefunden aber nichts was mir weitergeholfen hat.

ich hole daten aus einer DB
Java:
public void createJTable() {
	spalten = new Vector<String>();
	daten = new Vector<Vector<Object>>();
	model = new DefaultTableModel(daten, spalten);
	// Hole Daten aus DB
	createTableData();
	//das Model dem Table übergeben
	table = new JTable(model);
		
	table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	table.setAutoCreateRowSorter(true);
		
	//Zellen können nicht mehr bearbeitet werden.
	table = new JTable(model) {
		public boolean isCellEditable(int row, int column) {
			return false;
		}
	public Class getColumnClass(int columnIndex){
		if (columnIndex == 4)
		        return Boolean.class;
			else if (columnIndex == 4)
				return Integer.class;
				return String.class;
		}
	};		
		
	table.addMouseListener(new MouseAdapter() {
		public void mouseClicked(MouseEvent me){	
			selectedID = (int) (int) table.getValueAt(table.getSelectedRow(), 0); 
			System.out.println(selectedID); // test
		}
	});
		
	table.setFillsViewportHeight(true);
		
	//Texte in Table zentriert anzeigen
	DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
	dtcr.setHorizontalAlignment(JLabel.CENTER);
	DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) table
			.getDefaultRenderer(Object.class);
	defaultRenderer.setHorizontalAlignment(JLabel.CENTER);
		
	}

public void createTableData() {
	try {
		Statement stmt = getConnection().createStatement();
		ResultSet result = stmt.executeQuery("SELECT * FROM test");
		ResultSetMetaData rsmd = result.getMetaData();

		columns = rsmd.getColumnCount();
		// Columns Namen
		for (int i = 1; i <= columns; i++) {
			spalten.addElement(rsmd.getColumnName(i));
		}
		// row daten
		while (result.next()) {
			Vector<Object> row = new Vector<Object>(columns);
			for (int i = 1; i <= columns; i++) {
				row.addElement(result.getObject(i));
			}
			daten.addElement(row);
		}
		result.close();
		stmt.close();
	} catch (SQLException sqle) {
	}
}
und mit den zwei methoden lege ich sie in den jtable, funktioniert alles wunderbar.

datensätze hinzufügen funktioniert auch wenn die transaktion abgeschlossen ist trage ich per "hand" den datensatz nach
Java:
model.addRow(new Object[]{maxID, tfvorname.getText(), tfnachname.getText(),tfDate.getText(), box.isSelected()});

nun zu meiner frage, da wo ich schon am verzweifeln bin!
wenn ich datensätze ändern will wie bekomm ich die änderung sofort in den table??

ich gehe wie folgt vor
ich hole erstmal die daten aus der db und gebe sie in einem fenster mir textfields aus
wenn ich jetzt die textffields berarbeite sprich text neu eingebe bestätige ich die eingabe über einen button und die daten IN DER DB wurden geändert jedoch die änderung im table bekomm ich nicht hin!

ich arbeite mit einem DEFAULTTABLEMODEL
ich habs schon mit dem model.setValue(Object[], row, col) check das aber irgendie nicht!:bahnhof:

hoffe ich hab das einigermaßen verständlich erklärt.

gruss thomas
 

Joose

Top Contributor
Bei einem entsprechenden Aufbau sollte es möglich sein das beim "Klick auf den Button" der für die Änderung in der DB sorgt auch gleich das Refreshen deiner JTable veranlasst.
 

Thallius

Top Contributor
Du kannst es fuschen und einfach ein

tablemodel.fireTableDataChanged() oder table.repaint()

schicken. Dann wird aber immer die ganze Tabelle neu geladen. Es gibt aber genauso Methode wie

tablemodel.insertrow

etc. Einfach mal die API Doku lesen würde ich sagen

Gruß

Claus
 
Zuletzt bearbeitet:

thet1983

Top Contributor
Danke für die Antworten.
table.repaint() funkt nicht.
Api lese ich als erstes ( sofern ich es verstehe)

Werd die anderen Methoden mal testen
Danke!
 

Harry Kane

Top Contributor
Du kannst es fuschen und einfach ein

tablemodel.fireTableDataChanged()

...wobei die Variante mit tablemodel.fireTableDataChanged() eigentlich kein Pfusch ist.
Repaint() bringt an dieser Stelle nix, weil die existierende Tabelle nicht nur neu gezeichnet, sondern auch an das geänderte TableModel angepasst werden muß. Bei einem repaint() verwendet die JTable vermutlich aus Performancegründen offenbar gecachte Werte, anstatt zu überprüfen, ob sich ev. das TableModel geändert hat. Dies ist zumindest meine Vermutung, die sich aus den Erfahrungen mit JTables (und anderen JComponents) ergeben hat.
 

Thallius

Top Contributor
...wobei die Variante mit tablemodel.fireTableDataChanged() eigentlich kein Pfusch ist.
Repaint() bringt an dieser Stelle nix, weil die existierende Tabelle nicht nur neu gezeichnet, sondern auch an das geänderte TableModel angepasst werden muß. Bei einem repaint() verwendet die JTable vermutlich aus Performancegründen offenbar gecachte Werte, anstatt zu überprüfen, ob sich ev. das TableModel geändert hat. Dies ist zumindest meine Vermutung, die sich aus den Erfahrungen mit JTables (und anderen JComponents) ergeben hat.

Natürlich ist es eine Pfusch, weil ich die kompletten Daten neu laden und anzeige und das wo sich nur 1 Datensatz geändert hat. Wenn ich das mit einer Tabelle mache die 50000 Einträge hat, dann verbrät das ungemein CPU Power was einfach nicht nötig ist.

Der Programmierer weis ja welcher Datensatz geändert wurde, bzw ob einer hinzugefügt oder einer gelöscht wurde. Ich kann also der Tabelle auch genau diese Information geben und diese muss dann u.U. sogar einfach nur eine Zeile löschen statt 49999 Datensätz neu laden.

Ich glaube aber es ist bei Java Programmieren in der Regel so, dass nicht viel über Performance und Resourcen nachgedacht wird, sondern einfach nur "schnell" programmiert wird. Das Ergebnis zählt, der Weg ist egal.

Gruß

Claus
 
Zuletzt bearbeitet:

Joose

Top Contributor
Natürlich ist es eine Pfusch, weil ich die kompletten Daten neu laden und anzeige und das wo sich nur 1 Datensatz geändert hat.

Die Daten werden ja nur neu aus dem Model geholt, das sollte von der Performance her kein großes Problem sein.
JTable ist es auch möglich nur bestimmte Teile neu zu zeichnen. (jenachdem welche Zeilen/Zellen sich geändert haben)
 

Harry Kane

Top Contributor
@Thallius:
Ich nehme an, du hast schon eine Reihe von Benchmarks laufen lassen, so daß du solche Aussagen machen kannst?
Leider weiss ich nicht, was du mit deiner etwas schwammigen Formulierung von "Daten nachladen" eigentlich meinst. Die Daten stehen im TableModel, und dieses wir ja in jedem Fall nur um einen Eintrag ergänzt, egal mit welchem Event das darauffolgende Neuzeichnen der JTable ausgelöst wird. Auf der Stufe des Models wird also nix "nachgeladen". Bleibt die Frage, ob die JTable irgendwas "nachlädt" und wenn ja, ob sich der Umfang in Abhängigkeit von der verwendeten fireXXX Methode des TableModels nennenswert ändert bzw. ob tatsächlich "ungemein CPU Power (mehr) verbraten" wird.
Ich habe gerade etwas mit einer JTable in einer selbst geschriebenen Anwendung rumgespielt. Die JTable enthält ca. 35000 Zeilen und 100 Spalten. Durch eine Filteroperation wird die Anzahl der Zeilen die angezeigt werden sollen, auf 1000 reduziert (in der dem TableModel zugrunde liegenden Datenstruktur sind noch alle Daten vorhanden). Das Hin-und Herschalten zwischen filterndem und nicht filterndem TableModel (wobei die Änderung über fireTableDataChanged signalisiert wird) bringt die CPU kurrzeitig (< 2 s) auf 3 % Prozessorlast, am Speicherverbrauch ändert sich nix.
 

Thallius

Top Contributor
Wenn der TO die Daten in der DB ändert, dann muss das TableModell die Daten neu nachladen wenn es nicht weiß welcher Datensatz sich geändert hat. Sprich es müssen alle Daten neu aus der DB geholt werden. Klar geht das schnell wenn man nur so wenig Datensatz hat dass diese alle in den Speicher passen, denn dann optimiert die DB das Lesen. Aber wenn Du erstmal ein paar Millionen Einträge hast und dann mit einem Query die geforderten Daten auslesen willst, dann dauert das eben länger als wenn du einfach dem Modell direkt sagst welcher Datensatz sich geändert hat und nur diesen liest.

Gruß

Claus
 

Joose

Top Contributor
[ot]Leider habe ich mich auch zu Offtopic hinreißen lassen, die Performance hier nicht das eigentliche Thema!
Es geht dem TO lediglich darum wie er auf eine Änderung der Daten reagieren kann um diese in seiner JTable angezeigt zu bekommen.
Ob es jetzt auf die Performance ankommt oder nicht muss dann der TO entscheiden, daher B2T :)[/ot]
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
[OT]
Wenn der TO die Daten in der DB ändert, dann muss das TableModell die Daten neu nachladen wenn es nicht weiß welcher Datensatz sich geändert hat. Sprich es müssen alle Daten neu aus der DB geholt werden. Klar geht das schnell wenn man nur so wenig Datensatz hat dass diese alle in den Speicher passen, denn dann optimiert die DB das Lesen. Aber wenn Du erstmal ein paar Millionen Einträge hast und dann mit einem Query die geforderten Daten auslesen willst, dann dauert das eben länger als wenn du einfach dem Modell direkt sagst welcher Datensatz sich geändert hat und nur diesen liest.
Du vermischst hier 2 Dinge bzw. Fragen:
1. Wie stellt das TableModel sicher, daß die Daten die es anzeigt, mit den Daten in der db übereinstimmen?
2. Wie bzw. mit welchem Event informiert das TableModel sein View, also die JTable, darüber, daß sich sein Inhalt geändert hat?
Für die Performance ist Punkt 1 entscheidend. Laut seiner Beschreibung holt der TO, wenn er einen Datensatz hinzugefügt hat, die Daten nicht nochmal komplett aus der db, sondern fügt den neu erstellten Datensatz von Hand an sein DefaultTableModel an. Er macht also genau das NICHT, was du zu recht als bei großen Tabellen als unperformant bezeichnet hast. Ich habe mich zu diesem Punkt gar nicht geäußert.
Punkt 2 (der nix mit Punkt 1 zu tun hat) sollte für die Performance irrelevant sein, und um Punkt 2 ging es zumindest bei den bisherigen Diskussionen.
Sorry für OT, aber ich mag es nicht, wenn Leute Beiträge nicht richtig lesen oder verstehen. Das führt nur zu unnötiger Verwirrung bei Leuten, die zwar eine etwas andere Fragestellung haben, aber auf der Such nach "JTable" und "Datenbank" in diesem Thread landen.
[/OT]
 

thet1983

Top Contributor
Hallo,
nach langem hin und her und unzähligen versuchen mir ein Model zubauen, hab ich es auf meine (russische) art und weise erledigt, ist zwar nicht schön aber es funktioniert....meine table hat in etwa 8-9000 Datensätze und er braucht zum aktualisieren nicht länger oder beansprucht mehr power.

Java:
private void alterRow(){
	try{
		PreparedStatement stmt = getConnection().prepareStatement(db.getQuery());
		stmt.setString(1, tf1.getText().trim());
		stmt.setString(2, tf2.getText().trim());
		stmt.setDate(3, Date.valueOf(tf3.getText()));
		stmt.setInt(5, selectedID);
		if(box.isSelected()){
			stmt.setBoolean(4, true);
		}else{
			stmt.setBoolean(4, false);
		}
			
		int rs = stmt.executeUpdate();			
		if(rs > 0){ 
			daten.removeAllElements(); // alle Daten im "Vector daten" löschen
			table.repaint(); // table neu laden --> leer
			createTableData(); // daten neu aus DB holen
			table.repaint(); // table neu laden --> voll
		}	
	}catch(SQLException sql){
		System.out.println(sql.getMessage());
	}
}

wie gesagt ist nicht schön aber es funktioniert.

nochmals Danke für die Antworten!!
 

Harry Kane

Top Contributor
Ich bin verwirrt.
Oben hast du noch geschrieben, daß ein repaint() auf der JTable NICHT funktioniert (was sich auch mit meinen Erfahrungen deckt), und jetzt hast du gleich 2x ein repaint() drin? Zumindest das erste repaint() ist überflüssig.
Und wenn deine createTableData() Methode immer noch so ist wie in deinem ersten Post, sehe ich nicht wie es jetzt funktionieren sollte.
Ich habe den Verdacht, daß du irgendwo dein existierendes TableModel nochmal der JTable verpasst. Und davon würde ich abraten, da diese Variante nicht wirklich "sauber" ist.
 

thet1983

Top Contributor
Hallo Harry Kane,

Hab die table erzeugnung und die "hole daten aus der db" in zwei methoden geschrieben
der code ist nicht mehr aktuell

Java:
daten.removeAllElements(); // alle Daten im "Vector daten" löschen
createTableData(); // daten neu aus DB holen ---> jetzt mit "String query" im Konstruktor <----
table.repaint(); // table neu laden --> voll

funktioniert einwandfei!

wie oben schon erwähnt arbeite ich mit einem DefaultTableModel da ich leider zu unfähig bin mir ein eigenes model zuschreiben..

ob es nicht sauber, unschön oder weiß gott was ist, ist mir relativ egal....funktionieren muss es und sonst nichts. (ich mach das NICHT beruflich, ich schreibe nur anwendung für mich und meine firma wo ich arbeite, für meine abteilung) deswegen wie schon gesagt, WENN ES FUNKTIONIERT PASST DAS :)

gruss thomas
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JTable mit MySQL Datenbank füllen AWT, Swing, JavaFX & SWT 12
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
L JTable aus MySQL DB updaten - Live AWT, Swing, JavaFX & SWT 7
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben