JTable - Daten zur Laufzeit ändern

MichaelOswald

Grünschnabel
Hallo, dies ist mein erster Post und ich hoffe es passt so ;)

Ich möchte in einer JTable zur Laufzeit in einer Spalte bei einer Änderung das Änderungsdatum neu setzen.

Ich habe eine einfach Klasse erstellt (ToDoTableModel):
public class ToDoTableModel extends DefaultTableModel {
Dort wird einfach nur "isCellEditable" geändert um die Bearbeitung auf ein paar spezielle Spalten einzugrenzen.

Ich habe meine Testanwendung (ToDoURL) auf ein Miminum heruntergebrochen.
Ich erzeuge die JTable:
Java:
myTableModel = new ToDoTableModel(new Object[0][0], COLHEADS);
urlTable = new JTable(myTableModel);
Es gibt in der Applikation einen Testbutton mit folgendem Source:
public void actionPerformed(ActionEvent ae) {
  Object eventTarget = ae.getSource();
    if (eventTarget==jbtest) {
      int selectedRow = urlTable.getSelectedRow();
      urlTable.setRowSelectionInterval(selectedRow,selectedRow);
      urlTable.setColumnSelectionInterval(5,5);
      urlTable.setValueAt("xx.xx.2009 xx:xx:xx", selectedRow, 5);
    } else if (eventTarget==jbnewentry) {
      newURL();
    }
}
Per Button wird jetzt in Spalte 5 in der gewählten Zeile das Datum gesetzt. Soweit funktioniert noch alles. Ich brauche die Funktion aber im "tableChanged" Event:
Java:
myTableModel.addTableModelListener(new TableModelListener() {
  public void tableChanged(TableModelEvent tme) {
    switch (tme.getType()) {
      case TableModelEvent.UPDATE:
        System.out.println("UPDATE");	
        int selectedRow = urlTable.getSelectedRow();			
        urlTable.setRowSelectionInterval(selectedRow,selectedRow);
        urlTable.setColumnSelectionInterval(5,5);
        urlTable.setValueAt("xx.xx.2009 xx:xx:xx", selectedRow, 5);	
        break;
Wenn ich den Code dort nutze kommt ein
"Exception occurred during event dispatching:
java.lang.StackOverflowError"...

Es muss doch eine einfach Option geben die Daten jetzt "on the fly" zu ändern.
Für eine Lösung bin ich dankbar.

Gruß Michael (Java Neuling...)
 

Anhänge

  • ToDoTableModel.txt
    481 Bytes · Aufrufe: 33
  • ToDoURL.txt
    5 KB · Aufrufe: 32
Zuletzt bearbeitet:
Exceptions sind in Java eigentlich so gut zu lesen, dass man selber schnell auf das Problem dahinter kommt. Guck dir deinen StackOverflowError mal genau an. Darin müßtest du sehen, dass zwei oder mehr Methoden sich immer abwechselnd gegenseitig aufrufen. Dadurch ergibt sich eine Endlosschleife und der Stack für die Aufrufe ist dann natürlich irgendwann zu Ende.

Dann schau ob du rausfindest warum sich dass immer wieder gegenseitig aufruft. Damit hast du dann einen Ansatzpunkt was du ändern mußt.

(Ich habe mir den Code jetzt mal nicht angeschaut. Bitte nutze doch bei deinem nächste Post die zur Verfügung stehenden Code Tags [code=java]..[/code])
 
Hallo zeja,

erst einmal Danke - da ich Java in einem Jahr jetzt über eine Internet-Abendschule gelernt habe sind die Fehlermeldungen für mich noch nicht wirklich aussagekräftig. Ich nehme an das es evtl. daran hängt das ich beim
Java:
public void tableChanged(TableModelEvent tme) {
den 
setValueAt-Befehl nutze...
Durch den setValueAt wird wahrscheinlich wieder ein tableChanged aufgerufen usw...

Dann fehlt mir allerdings die Option noch anders festzustellen wann die Row verändert wurde um Datum/Uhrzeit zu ändern.

Gruß Michael
 
Hallo,

erst mal Danke für die Anregungen - aber....
Wenn ich hier was poste dann suche ich eine Lösung.

In meinem Fall möchte ich einfach in einer Zeile der JTable nach einer Änderung ein Änderungsdatum aktualisieren. Ich dachte das die Option über das
tableChanged-Event die beste wäre da dort ja abgefragt werden kann ob ein UPDATE, DELETE oder INSERT ausgeführt wurde.

Das führte aber wohl zu dem Fehler der bei mir aufgetreten ist. Ich habe jetzt gesucht und mir folgende Lösung zusammengebaut:
Java:
		urlTable.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent pce) {
				int selectedRow = urlTable.getSelectedRow();
				if (selectedRow!=-1) {
					if (pce.getOldValue()!=null) {
						Object oldValue = pce.getOldValue();
						if (oldValue instanceof DefaultCellEditor) {
							Object value = ((DefaultCellEditor)oldValue).getCellEditorValue();
							if (value!=null) {
								urlTable.setValueAt(mk.getDate()+" "+mk.getTime(), selectedRow, 6);	
							}
						}
					}
				}
			}
		});

Die Zeile mit dem instanceof DefaultCellEditor muss sein da bei einem späteren DISPOSE der Maske dort dann ein JViewPort übergeben wird - und es dann wieder eine Exception gibt.

Es gibt bestimmt noch andere Lösungen, aber die hier funktioniert erst mal.

Gruß Michael ;-)
 

Neue Beiträge

Zurück