problem bei der Umsetzung einer Auswahl der Hörer in eine JTable
Ich entwickle eine JTable mit verschiedenen Zeilen. Ich würde gerne verknüpfen Sie ein Ereignis, um die Auswahl einer Zeile in dieser Tabelle. Ich habe das folgende Auswahl-Klasse, der das Verhalten der Tabelle Auswahl:
public class TableSelectionListener implements ListSelectionListener{
public Integer item;
public TableSelectionListener(Integer item){
this.dialog = item;
}
public void valueChanged(ListSelectionEvent e) {
System.out.println("The row clicked is "+item);
}
}
Wenn ich erstellen Sie eine Instanz dieser Tabelle, sai tabletest, ich habe das folgende Stück code:
tabletest.getSelectionModel().addListSelectionListener(new TableSelectionListener(tabletest.getSelectedRow());
Das problem ist, dass wenn ich auf eine Zeile auf einmal, anstatt das abrufen der damit verbundenen Nachricht, sobald, ich wieder die gleiche Nachricht mehrmals, was darauf hindeutet, dass die Aktionen mehrere Male wiederholt. Zum Beispiel:
The row clicked is 0
The row clicked is 0
The row clicked is 0
The row clicked is 0
Weiß jemand, wo das problem sein kann?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, das ist nur normal.
Ihre Auswahl listener erstellt wird, mit dem Wert der
tabletest.getSelectedRow()
bei seiner Schaffung-Tabelle (die ist null). Und, wie Sie nie ändern Sie den Wert vonitem
in deinem listener dieser listener fcan nur Anzeige0
als Ergebnis.Wenn ich du wäre, ich wouold ersetzen Sie die
valueChanged()
Methode, durch so etwas wie (allerdings ungetestet und ich erinnere mich an seltsame Dinge passiert manchmal beim mischen von view und Modell Zeile Werte) diese :e.getFirstIndex()
ist nicht sehr zuverlässig. benutzen Sie die Tabelle.getSelectedRow() - es ist stabiler.Erstens, es ist völlig normal, um mehrere
ListSelectionEvent
s, während die Auswahl geändert wird. Sie können diegetValueIsAdjusting
Methode, um zu bestimmen, wenn die Auswahl beendet ist (es wird zurückfalse
).Zweitens, es gibt keine Notwendigkeit, erstellen Sie Ihre
TableSelectionListener
mit einer Zeilennummer. Wenn IhrvalueChanged
- Methode aufgerufen wird, können Sie den index des ersten/letzten markierten Zeile (denken Sie daran es ist möglicherweise, markieren Sie mehrere Zeilen in der Tabelle, es sei denn, Sie deaktivieren) mite.getFirstIndex()
unde.getLastIndex()
bzw.Einen einfacheren Weg, es zu tun, ist wie folgt: