TableModelChanged und editCellAt

Status
Nicht offen für weitere Antworten.
M

Minihops

Gast
Hallo,
ich bin noch nicht sehr geübt im Umgang mit Listener und GUI Programmierung. Daher habe ich folgendes Problem:
Ich habe eine Tabelle in die ich Daten eingebe. Habe ich in die 1. Zelle einen Wert eingegeben, soll das Programm in die 2 Zelle springen und dort direkt den Cursor setzen.

Meine Idee dazu war folgende:

Ich habe eine TableModelChanged Listener zum Table Model hinzugefügt und in die tableChanged Methode folgendes geschrieben:

Code:
private void jModeltableChanged(TableModelEvent e) {
		if (e.getColumn()==0 && e.getType() == e.UPDATE) {		
			jTable1.changeSelection(e.getFirstRow(),1,false,false);
			jTable1.editCellAt(e.getFirstRow(),1);
		}

und vorher dieses hier:
Code:
jTable1Model.addTableModelListener(new TableModelListener () {
						public void tableChanged(TableModelEvent e) {
							jModeltableChanged(e);
						}
					});


Allerdings bekomme ich dann einen irrelangen Stacktrace mit folgendem Fehler:
und mit dem kann ich nix Anfangen.
Danke für eure Hilfe


Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:387)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:417)
at javax.swing.DefaultListSelectionModel.setSelectionInterval(DefaultListSelectionModel.java:441)
at javax.swing.JTable.changeSelectionModel(JTable.java:1583)
at javax.swing.JTable.changeSelection(JTable.java:1628)
at de.catherine.gui.takeOrder.jModeltableChanged(takeOrder.java:232)
at de.catherine.gui.takeOrder.access$3(takeOrder.java:228)
at de.catherine.gui.takeOrder$4.tableChanged(takeOrder.java:166)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:639)
at javax.swing.JTable.setValueAt(JTable.java:1875)
at javax.swing.JTable.editingStopped(JTable.java:3333)

edit: omg sonst gehts noch? wenn du willst kannst du ja den space für die db das nächste mal selbst bezahlen :autsch:
 

Sky

Top Contributor
StackOverflowError: das sieht so aus, als würde durch changeSelection in deiner jModeltableChanged-Methode wiederrum die jModeltableChanged-Methode aufgerufen werden - immer und immer wieder... das sollte man nicht tun ;-)
 

Minifizz

Neues Mitglied
Hallo Minihops,

ich hatte das gleiche Problem und folgende Lösung gefunden, die in den meisten Fällen funktionieren wird: Du speicherst das TableModelEvent auf einer Klassenvariable. Dieser kann danach weiterverwendet werden und dient gleichzeitig als Flag, das ein Aufruf von tableChanged() stattgefunden hat.

Code:
TableModelEvent lastChangeEvent = null;

public void tableChanged(TableModelEvent e) 
{
   lastChangeEvent = e;
}

Die aktuelle Klasse wird zusätzlich zu einem FocusListener und implementiert die Methoden:

- public void focusGained(FocusEvent e) und
- public void focusLost(FocusEvent e).

Nachdem die Zelle geändert wurde bestätigt der Nutzer mit Return, klickt auf eine Zeile der JTable oder Doppelklickt auf eine andere Zelle in der Tabelle. In allen Fällen erhält die JTable den Focus und die Funktion focusGained() wird aufgerufen. In diese kannst du nun die weitere Verarbeitung, wie bisher fortsetzen:

Code:
public void focusGained(FocusEvent e)
{
  // Dem Erhalten des Focus ging kein tableChanged vorran.
  if( lastChangeEvent == null) return;
  
  // Hier folgen verschiedene Fälle der Verarbeitung
  if (e.getColumn()==0 && e.getType() == e.UPDATE)
  {       
         jTable1.changeSelection(e.getFirstRow(),1,false,false); 
         jTable1.editCellAt(e.getFirstRow(),1);
  }

  // Event zurücksetzen.
  lastChangeEvent = null;
}

public void focusLost(FocusEvent e)
{
  // Bleibt leer.
}

Dabei musst du beachten die Funktion nicht weiter auszuführen, wenn lastChangeEvent null ist und lastChangeEvent nach allen Fällen wieder auf null zu setzen, da focusGained() auch bei anderen Gelegenheiten vom System aufgerufen wird. Die Methode focusLost() bleibt leer.

Auch wenn der Beitrag schon ein viele Jahre her ist, hoffe ich weitergeholfen zu haben.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JTable, editCellAt liefert false AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben