JTable: ListSelectionListener removen

GGK_01

Bekanntes Mitglied
Hallo,

ich selektiere in einer JTable eine Zelle und lasse mir deren Wert in eine Textfeld schreiben. Mit diesem Wert löse ich dann eine Suche (LDAP) aus und schreibe die Ergebenisse wieder in die JTable zurück.

Dabei erhalte ich eine Fehlermeldung, die auch auf den noch existierenden ListSelectionListener zurückführe.
Die erste Tabelle kann mehrere Ergebniszeilen enthalten, die Tabelle nach der LDAP Abfrage immer nur eine Ergebniszeile (in der Regel).

folgende Fragen:

  • wie kann ich den SelectionListener wieder löschen?
  • wenn ich eine Selektion in der Tabelle vornehme, dann wird mit das Ergebnis zweimal angezeigt. Warum ist das so?


Java:
ListSelectionModel cellSelectionModel = table.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        cellSelectionModel.addListSelectionListener(new ListSelectionListener()
        
  		{
  		    public void valueChanged(ListSelectionEvent e) 
  		    {
  		      String selectedData = null;
  		      
  	        int selectedRow = table.getSelectedRow();
  	        int selectedColumns = table.getSelectedColumn();
  	        System.out.println("selectedRow: "+selectedRow);
  	        System.out.println("selectedColumns: "+selectedColumns);
  	        
  	        selectedData = (String) table.getValueAt(selectedRow, selectedColumns);
  	      
  	        
  	      
  	            
  	          }
  	        }
			*/
  	    System.out.println("Selected: " + selectedData)
            }
            });

StackTrace:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.Vector.elementAt(Unknown Source)
	at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
	at javax.swing.JTable.getValueAt(Unknown Source)
	at aimLoginCheck.AIMLogincheck$1.valueChanged(AIMLogincheck.java:161)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
Datensätze gefunden: 1
selectedRow: -1
selectedColumns: -1
	at javax.swing

danke für Eure Hilfe

GGK
 
[c]cellSelectionModel.removeListSelectionListener(...)[/c] o.ä.
Aber warum prüfst du nicht einfach, ob [c]selectedRow[/c] und [c]selectedColumns[/c] [c]>= 0[/c]?
 
Wie bereits erwähnt muss Du prüfen, ob die Selektion gültig ist.

Der Listener wird einmal bei der Deselektion und das zweite mal bei der Selektion aufgerufen. Unterscheiden kann man dies z.b. anhand der getValueIsAdjusting des Events.
 
Ich habe wie vorgeschlagen

Java:
if ((selectedRow >= 0) && (selectedColumns >=0)) {
selectedData = (String) table.getValueAt(selectedRow, selectedColumns);
}

eingebaut..und nun klappt das...aber das nächste Problem lauert bereits.

Nachdem ich die erste Tabelle ein zweites mal neu befülle (passiert über eine DB-Abfrage) liefert mir
selectedRow und selectedColumns jedesmal -1.

Gibts dazu eine Idee von jemanden?

GGK
 
wie es im Posting zuvor (13:49) steht: nicht wundern über Events mit -1, das kann einfach Informierung über Deselektion sein,
du hast ja das if dazu, schlechte Auswahlen ignorieren oder irgendwo 'nichts ist ausgewählt' anzeigen
 
OK..langsam wird mir das klar.

Was ich jedoch meinte war, dass sich beim Zurückwechseln auf die initiale Tabelle auch bei Selektion einer Zelle deren Inhalt nicht über den Listener in der Variable auffangen lässt.
Hier wird auch bei der Selektion als Ergebnis von selectedRow selectedColumns jeweils -1 geliefert.

Über welchen Stein bin ich hier gestolpert?

Danke sehr
GGK
 
"beim Zurückwechseln auf die initiale Tabelle auch bei Selektion einer Zelle deren Inhalt nicht über den Listener in der Variable auffangen lässt.
Hier wird auch bei der Selektion"

etwas sehr knapp, der Inhalt der Tabelle wird ausgetausch und dann noch selektiert? per Maus oder Programmbefehle?

dass dann ein erstes Selektionsereignis nicht gut funktioniert kommt mir minimal bekannt vor von anderen Themen,
an Lösung fällt mir dazu aber nichts bestimmtes ein

wie schon mindestens einmal in einem Thema geschrieben wäre ein vollständiges kleines Testprogramm dazu gut,
Dummy-Daten, Button der minimal einfach etwas austauscht,
aber mit der Gefahr, dass zumindest ich persönlich dann auch nur sagen kann 'aha, ja, ist so',
also keine Lösung und viel Mühen umsonst
 
Hi,

Problem gelöst.
Ich habe für die Darstellung der Ergebnisse der zweiten Abfrage nochmals die Table deklariert...
Java:
JTable table = new JTable();

Danke Euch

GGK
 

Zurück
Oben