Über CellEditorListener an die JTable gelangen

ElJarno

Bekanntes Mitglied
Hi Leute,
ich habe folgendes Problem. Bisher haben wir bei mir in der Firma die geänderten Daten in der JTable über eine CellEditorListener abgefangen um sie dadurch merken zu können damit man sie am Ende in die DB schrieben kann. Nun ist es so dass ich mehrere Tabellen habe. Ich wollte aber nicht für jede Tabelle eine eigen CelleditorListenKlasse schreiben. Weil in der editingStoppen-Methode greife ich ab welches Feld geändert wurde um so den Wert auch in das Richtige DB Feld eintragen zu können
Hier mal der Code zur CelleditorListener Klasse:
Java:
		tableDatei.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(
				new CellLis());
...
...

	public class CellLis implements CellEditorListener {
		public void editingCanceled(ChangeEvent e) {
			System.out.println("CellLis editingCanceled Jan");
		}

		public void editingStopped(ChangeEvent e) {
			try {
				if (e.getSource() instanceof JTable) {
					JTable table = (JTable) e.getSource();
					int colId = table.getSelectedColumn();
					int rowId = table.getSelectedRow();
					Object value = table.getModel().getValueAt(rowId, colId);
					String colName = table.getColumnName(colId);
					String objIDColName = getObjIDFeldName(e.getSource().toString());

					if (value != null) {
						if (!(objIDColName == null || objIDColName.equalsIgnoreCase(""))) {
							int indexObjID = table.getColumnModel().getColumnIndex(objIDColName);
							String objID = table.getModel().getValueAt(rowId, indexObjID)
									.toString();
							if (!(objID == null || objID.equalsIgnoreCase(""))) {
								merkeGeaenderteDaten(rowId, objID, colName, value.toString());
							}
							((DefaultTableModel) table.getModel()).fireTableDataChanged();
						}
					}
				}
			} catch (Exception ex) {
				System.out.println("Fehler beim merken der geänderten Daten" + ex.getMessage());
				ex.printStackTrace();
			}
		}
	}
Meine Idee wär jetzt gewesen irgendwie über das chnageevent e an die JTbale zu gelangen. Jedoch bekommt man bei getSource() nur das CellEditorTextField.
Hat jmd. ne Idee?

Gruß Jan
 
Keine Ahnung warum wir das so machen. Bin auch noch blutihger Anfäner hier. Oke ich werds dann erst mal damit versuche. Is halt nur blöd dass der auch schon reagiert wenn man eine neu Zeile einfügt und dann noch mal wenn sie mit Werten gefüllt wird. Beim CellEditor hat man den Vorteil dass wirklich erst dann reagiert wird wenn durch den Benutzer eine Änderung hervogerufen wird. Aber könnte trotzdem klappen.
 
Du hast ja die Möglichkeit vom TableEvent zu erfragen, ob eine Zelle einfach nur aktualsiert wurde, oder ob Zellen eingefügt bzw. gelöscht wurden. siehe API Doku: TableModelEvent
Muss den auf letzteres in der Datenbank nicht reagiert werden?
 
Muss den auf letzteres in der Datenbank nicht reagiert werden?
Geht so, ich hab da noch nicht so den dreh raus wie ich das alles am besten anstelle. Im Prinzip will ich sowas machen dass ich ich nur geänderte Felder in die Datenbank schreibe möchte. Also am Anfang wird halt aus der DB gelesen und die Werte in die TableModel gepackt. Da geschieht schon mal das erste Füllen, diese Wert müssen natürlich nicht für ein UPDATE Statement gemerkt werden. Werden bestimmte Felder geändert sollen die geänderten Werte gemrkt werden mitsamt des Feldnamen. Jetzt gibt es natürlcih aber auch noch den Fall dass ich neue Zeilen einfüge, also neue Datensätze anlegen will. Hier muss natürlich die ganze Zeile mitsmt allen Feldern als INSERT Statement in die DB geschrieben werden. Hinzu kommt dass ich bestimmte Intialwerte vorgebe als einen Primärschlüssel oder ein Datum zum Beispiel. Vlt. kanns du mir ja ein paar Anreize geben die mir vielleicht helfen könnten.
Was mir grad auch noch eingefallen ist warum wir den CellEditorListener genommen haben, ist dass wir falls kein anerer Wert einegeben worden ist al vorher drin stand bzw. die Bearbeitung abgebrochen ist, die CancelCellEdititing auslösen und somit die Änderung nicht merken.

Vielen Dank schon mal im voraus.

Gruß Jan
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben