12 Stimmen

JTable Zellenhörer?

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?

11voto

parsifal Punkte 266

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.

5voto

kleopatra Punkte 50122

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X