Ich verwende eine JTable. Ich muss benachrichtigt werden, wenn sich eine Zellenauswahl ändert. Ich habe versucht, den ListSelectionListener zu verwenden, aber ich erhalte nur Benachrichtigungen, wenn sich die Zeilenauswahl ändert. Wenn ich eine neue Spalte in derselben Zeile auswähle, werde ich nicht benachrichtigt. Ich muss wissen, wenn die Zelle ausgewählt ist, nicht wenn sich der Wert der Zelle ändert. Gibt es einen Listener, den ich dafür verwenden kann?
Antworten
Zu viele Anzeigen?Der einfachste Weg, dies zu tun, besteht darin, setCellSelectionEnabled(true)
aufzurufen und eine Referenz zu Ihrer Tabelle an den Listener zu übergeben. Wenn der Listener aufgerufen wird, rufen Sie getSelectedRow()
und getSelectedColumn()
auf der ursprünglichen Tabelle auf.
Die Alternative besteht darin, einen Zeilenauswahllistener auf der Tabelle, einen Spaltenauswahllistener auf dem ColumnModel
zu setzen und dann deren Schnittmenge zu ermitteln.
Ein Weg, um Benachrichtigungen über Änderungen der _Spalte_auswahl zu erhalten - wie bereits von @parsifal (in den Kommentaren) beantwortet ist, die interne selectionModel des TableColumnModels zu erfassen und einen Listener zu registrieren:
table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener);
Ein anderer Weg ist das Registrieren eines TableColumnModelListeners mit dem columnModel:
table.getColumnModel().addColumnModelListener(columnModelListener);
Der erste Weg ist "kürzer" im Hinblick auf den Code: nur eine Methode zu implementieren im Vergleich zu mehreren - meistens leer, außer der columnSelectionChanged Methode.
Der zweite Weg ist robuster gegen dynamische Änderungen: Bei dem ersten Weg gibt es keine Möglichkeit, sich gegen Änderungen der selectionModel Eigenschaft des columnModels abzusichern ... weil es keine Eigenschaft ist. Anders gesagt: im (zugegebenermaßen seltenen) Fall, dass der Anwendungscode das selectionModel austauscht, hört der Listener ins Leere. Das Installieren eines columnModelListeners ist immun gegen solche Änderungen, da das columnModel die Ereignisse von seinem selectionModel weitergibt, egal welches es ist.