Über CellEditorListener an die JTable gelangen

ElJarno

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:
Code:
        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
 
Hi!
Ich verstehe dein Problem nicht so ganz.
Wieso kannst du nicht eine CellListener -Instanz erstellen und diese alle Tabellen zuweisen? Über event.getSource() in der editingStopped() Methode bekommst du doch dann heraus, welche Tabelle gerade bearbeitet wurde?

*grüssle*
 
Ja ich muss die CelleditorListner doch den den Celleditoren zuweisen oder nicht? Ansonsten versteh ich nicht ganz wie das meinst.Vlt. ein bisschen Code?:) Und genau wie du sagt will ich nicht für jede Tabelle eine eigene Listener Klasse schreiben. Naja einfach noch mal schreiben wie du das genau meinst.

Danke im Voraus
 
So meinte ich das:
Code:
CellLis listener = new CellLis();
tableDatei1.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(listener);
tableDatei2.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(listener);
tableDatei3.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(listener);
tableDatei4.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(listener);

public void editingStopped(ChangeEvent e) {
if (e.getSource() instanceof JTable) {
     JTable table = (JTable) e.getSource();
   .....
   //hier zum Beispiel abfragen, welche Tabelle, wenn man das benötigt:
   //if(tableDatei1 == table){}
}

*grüssle*
 
Zuletzt bearbeitet:
Ja genau hier liegt ja das Problem e.getSource ist eine Instanz von CellEditorTextField und wenn du dort hin Castest und dann getParent() veruscht kommt ne NullPointerException
 
Ahh.. jetzt wird es klarer...
Dann mach es doch so:
Code:
tableDatei1.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(new CellLis(tableDatei1));
tableDatei2.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(new CellLis(tableDatei2));
tableDatei3.getColumnModel().getColumn(1).getCellEditor().addCellEditorListener(new CellLis(tableDatei3));

...

 public class CellLis implements CellEditorListener {
       JTable source;
       public CellLis (JTable source){
                 this.source = source;
       }

Übrigens, um auf Änderungen zu reagieren würde ich eher das TableModelEvent nutzen. Denn über den CellListener bekommt ihr nicht micht, wenn Zeilen hinzugefügt oder geändert werden. Sofern ihr das überhaupt benötigt...

*grüssle*
 
Zurück