In einer JTable können auf unterschiedliche Art und Weise Zellen selektiert werden: zum einen nur in einer Zeile oder Spalte, zum anderen kann auch ein ganzer Block oder können auch beliebige Zellen selektiert werden. Die Art der Selektion bestimmen Konstanten in ListSelectionModel. So wird SINGLE_SELECTION nur die Selektion einer einzigen Zelle zulassen.
Beispiel: In einer JTable soll entweder ein ununterbrochener Block Zeilen oder Spalten ausgewählt werden dürfen:
table.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
Mit Methoden lassen sich im Programm alle Elemente einer Spalte oder Zeile selektieren. Die Selektier-Erlaubnis geben zunächst zwei Methoden:
- table.setColumnSelectionAllowed( boolean )
- table.setRowSelectionAllowed( boolean )
Die automatische Selektion von Spalten gelingt mit der JTable-Methode setColumnSelectionInterval(int, int), weitere Bereiche lassen sich mit addColumnSelectionInterval(int, int) hinzufügen und mit removeColumnSelectionInterval(int, int) entfernen. Das Gleiche gilt für die Methoden, die »Row« im Methodennamen tragen.
Beispiel: Selektiere in einer JTable table die Spalte 0 komplett:
table.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); table.setColumnSelectionAllowed( true ); table.setRowSelectionAllowed( false ); table.setColumnSelectionInterval( 0, 0 );
Selektiere in einer Tabelle nur die Zelle 38, 5:
table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); table.setColumnSelectionAllowed( true ); table.setRowSelectionAllowed( true ); table.changeSelection( 38, 5, false, false );
Als Selektionsmodus reicht SINGLE_SELECTION aus, MULTIPLE_INTERVAL_SELECTION wäre aber auch in Ordnung. Beide Selektionen sind zusammen in der Form nicht möglich. Bei einer Einzelselektion wird die Zelle nur umrandet, aber nicht wie beim Standard-Metal-Look-and-Feel blau ausgefüllt.
Die Methode selectAll() selektiert alle Elemente, und clearSelection() löscht alle Selektionen.
Hallo Herr Ullenboom,
ich meinte Ihre Lösung zur Auswahl einer einzigen Zelle (hier: 38,5) in meiner Class umgesetzt zu haben. Leider führt aber der Index für die Spalte nicht zu dem gewünschten Ergebnis. Vielmehr „rutscht“ der Fokus eine Spalte weiter. Mein Index muss eigentlich stimmen, weil bei „getSelectedColumn liefert er mir immer brav den erwarteten Wert.
Haben Sie eine Ahnung, warum changeSelection die falsche Spalte festlegt?
Danke!