fire methoden auch bei defaultTableModel?

Status
Nicht offen für weitere Antworten.

Benny85

Mitglied
Hallo alle zusammen,

ich habe ein JTable, welches mit Daten aus einer DB gefüllt wird.
Um die Daten in den JTable hineinzubekommen, benutze ich das defaultTableModel, soll heissen kein besonders angepasstes TableModel. Codetechnisches sieht das so aus :

hier wird der JTable initialisiert (eigener Renderer, damit Buttons im JTable dargestellt werden können)
Code:
JTable userlist = new JTable(querysize,8)
		{
			public TableCellRenderer getCellRenderer(int row, int column) {
				TableColumn tableColumn = getColumnModel().getColumn(column);
				TableCellRenderer renderer = tableColumn.getCellRenderer();
				if (renderer == null) {
					Class c = getColumnClass(column);
					if( c.equals(Object.class) )
					{
						Object o = getValueAt(row,column);
						if( o != null )
							c = getValueAt(row,column).getClass();
					}
					renderer = getDefaultRenderer(c);
				}
				return renderer;
			}
			
			public TableCellEditor getCellEditor(int row, int column) {
				TableColumn tableColumn = getColumnModel().getColumn(column);
				TableCellEditor editor = tableColumn.getCellEditor();
				if (editor == null) {
					Class c = getColumnClass(column);
					if( c.equals(Object.class) )
					{
						Object o = getValueAt(row,column);
						if( o != null )
							c = getValueAt(row,column).getClass();
					}
					editor = getDefaultEditor(c);
				}
				return editor;
			}
			
		};
...und hier wird das JTable gefüllt:
Code:
ResultSet userlistrset = userstmt.executeQuery(query);
			int row = 0;
			
			while (userlistrset.next()) {	
				int column = 0;
				for (int i=1; i<=6; i++) {
					userlist.setValueAt(userlistrset.getString(i), row, column);
					column++;
					
				}

Nach bestimmten Benutzeraktionen sollen die Daten des JTables neu aus der Datenbank gelesen werden. Hierzu benutzt man eine der Firemethoden, richtig? Ich habe von diesen Firemethoden jedoch immer nur im Zusammenhang mit eigenen tableModels gelesen. Ist das aufrufen dieser Methoden mit dem defaulTableModel nicht möglich? Wenn doch: wie?

Danke schonmal!
Benny
 
Du brauchst gar nichts aufzurufen. Das funktioniert automatisch wenn du das DefaultTableModel richtig benutzt.
Änder die Daten im Model und nicht in der Table, dann passt das.
 
hmm, sehr wahrscheinlich nutze ich das defaultTableModel dann nicht richtig ;-)
Meine Aussage rührt daher, dass es hiess, man nutzt automatisch das defaultTableModel, wenn man nichts anderes nutzt ;-)

Der entsprechende relevante Code (inkl. Datenbankconnections der vollständigkeit halber) sieht folgendermassen aus ("querysize" ist ein integerwert):
Was muss ich ändern, damit die Daten in der GUI aktualisiert werden?
Das Vorgehen sieht folgendermassen aus: User lässt sich Tabelle anzeigen -> User ändert oder löscht dann Datensätze in der DB (funktioniert bereits) -> Tabelleninhalt wird aktualisiert
Code:
JTable userlist = new JTable(querysize,8)
		{
			public TableCellRenderer getCellRenderer(int row, int column) {
				TableColumn tableColumn = getColumnModel().getColumn(column);
				TableCellRenderer renderer = tableColumn.getCellRenderer();
				if (renderer == null) {
					Class c = getColumnClass(column);
					if( c.equals(Object.class) )
					{
						Object o = getValueAt(row,column);
						if( o != null )
							c = getValueAt(row,column).getClass();
					}
					renderer = getDefaultRenderer(c);
				}
				return renderer;
			}
			
			public TableCellEditor getCellEditor(int row, int column) {
				TableColumn tableColumn = getColumnModel().getColumn(column);
				TableCellEditor editor = tableColumn.getCellEditor();
				if (editor == null) {
					Class c = getColumnClass(column);
					if( c.equals(Object.class) )
					{
						Object o = getValueAt(row,column);
						if( o != null )
							c = getValueAt(row,column).getClass();
					}
					editor = getDefaultEditor(c);
				}
				return editor;
			}
			
		};
		/////////
		try {
			Class.forName( "com.mysql.jdbc.Driver" );
			Connection cn = DriverManager.getConnection( "jdbc:mysql://193.196.183.10:3306/DoKuVe","root","luftkuchen" );
			Statement userstmt = cn.createStatement();
			String query = "SELECT t.BenutzerID,s.name,t.Benutzername,t.Passwort,t.StudiengangsLeiter,t.Administrator FROM tblBenutzer t, tblStudiengang s WHERE t.StudiengangID = s.StudiengangID";
			ResultSet userlistrset = userstmt.executeQuery(query);
			int row = 0;
			
			while (userlistrset.next()) {	
				int column = 0;
				for (int i=1; i<=6; i++) {
					userlist.setValueAt(userlistrset.getString(i), row, column);
					column++;
					
				}
				addUserButton changeButton = new addUserButton();
				changeButton.setIcon(editicon);
//				rowButton.setText("ändern");
				changeButton.setActionCommand("changeuser" + userlistrset.getString(3));
				changeButton.addActionListener(changeButton);
				userlist.setValueAt( changeButton, row, 6 );
				
				addUserButton deleteButton = new addUserButton();
				deleteButton.setIcon(deleteicon);
				deleteButton.setActionCommand("deleteuser" + userlistrset.getString(3));
				deleteButton.addActionListener(deleteButton);
				userlist.setValueAt(deleteButton, row, 7);
				
				
				row++;	
			}
		userstmt.close();
		cn.close();
		}
		catch (Exception e) {
			System.out.println(e.getMessage());
			System.out.println("Ohoh, im Catchblock gelandet....");
		}
		////////
		TableColumn column0 = userlist.getColumnModel().getColumn(0);
		column0.setHeaderValue("Benutzer ID");
		userlist.getColumnModel().getColumn(0).setPreferredWidth(30);
		TableColumn column1 = userlist.getColumnModel().getColumn(1);
		column1.setHeaderValue("Studiengang");
		TableColumn column2 = userlist.getColumnModel().getColumn(2);
		column2.setHeaderValue("Benutzername");
		column2.setPreferredWidth(30);
		TableColumn column3 = userlist.getColumnModel().getColumn(3);
		column3.setHeaderValue("Passwort");
		TableColumn column4 = userlist.getColumnModel().getColumn(4);
		column4.setPreferredWidth(30);
		column4.setHeaderValue("Administrator?");
		TableColumn column5 = userlist.getColumnModel().getColumn(5);
		column5.setHeaderValue("Studiengangsleiter?");
		column5.setPreferredWidth(30);
		TableColumn column6 = userlist.getColumnModel().getColumn(6);
		column6.setHeaderValue("ändern");
		column6.setPreferredWidth(10);
		TableColumn column7 = userlist.getColumnModel().getColumn(7);
		column7.setHeaderValue("löschen");
		column7.setPreferredWidth(10);
		
		userlist.setDefaultRenderer( JComponent.class, new JComponentCellRenderer() );
		userlist.setDefaultEditor( JComponent.class, new JComponentCellEditor() );
	  
		benutzeradminpanel.add(new JScrollPane(userlist), BorderLayout.CENTER );

Danke für die Hilfe!
Benny
 
Benny85 hat gesagt.:
..Das Vorgehen sieht folgendermassen aus: User lässt sich Tabelle anzeigen
-> User ändert oder löscht dann Datensätze in der DB (funktioniert bereits)
-> Tabelleninhalt wird aktualisiert..
Die Änderung ist ja eh sofort sichtbar, wenn sie in der Tabelle gemacht wird.
Löschen kannst du mit:
Code:
((DefaultTableModel)userlist.getModel()).removeRow(row);
 
Hallo André,

vielen Dank für deinen Vorschlag!
Ich denke, dass das Problem bei mir ist, dass ich den JTable rein zum anzeigen der Daten benutze, d.h. wenn ich etwas löschen möchte, setze ich direkt einen SQL-Befehl ab, der den Datensatz in der Datenbank löscht, gleich verfahre ich, wenn ich Daten ändern möchte.
D.h. ich brauche im Endeffekt einfach einen Befehl, mit dem ich den JTable aktualisieren/neu laden lassen kann.
Wahrscheinlich hätte ich es einfacher gehabt, wenn ich die Daten erst im JTable und dann anschliessend in der DB hätte ändern lassen...aber naja, hab ich halt nicht gemacht und es wäre mir natürlich am liebsten, wenn ich meinen Code jetzt nicht mehr grundlegend umschreiben müsste sondern einen Workaround finden würde...

Analog zu deinem Vorschlag habe ich gerade probiert, über userlist.getModel().fire... eine entsprechende Methode aufzurufen (unter zuhilfename der vorschlagsliste von eclipse)... geht leider nicht. Und userlist direkt hat nur die methode firePropertyChange() implementiert...

Viele Grüsse, Benny
 
Mach die Tabelle leer:
Code:
userlist.setModel(new DefaultTableModel(querysize,8));
und füll sie dann wieder auf.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben