2014-12-08 11 views
6

Ho un TableView di sola lettura in JavaFX 8 e non desidero che gli utenti selezionino le righe.
Dovrebbero essere ancora in grado di ordinare le colonne e scorrere, basta non selezionare alcuna riga.
Come posso ottenere questo risultato?Disabilita selezione riga in TableView

+0

tecnicamente, è possibile annullare la selezioneModello - potrebbe disattivare la navigazione, anche se (non può provare in questo momento). Inoltre, la copia non sarebbe possibile. Curioso: perché vuoi detistorre l'esperienza utente? – kleopatra

+1

@kleopatra L'impostazione di SelectionModel su null genererà eccezioni quando l'utente ordina le colonne. – BioRoy

+1

buono a sapersi, grazie per le informazioni :-) Mi sembra un bug (null selectionModel è un valore valido), quindi ho archiviato un problema: https://javafx-jira.kenai.com/browse/RT-39624 – kleopatra

risposta

7

Dopo un po 'ho trovato come risolverlo in modo da postarlo qui per i futuri utenti.
La soluzione si basa su questa risposta: JavaFX8 - Remove highlighting of selected row

Dopo aver aggiunto le seguenti righe al CSS, le linee selezionate appariranno linee esattamente come non selezionati, ottenendo lo stesso effetto che volevo nello stesso posto:

.table-row-cell:filled:selected { 
    -fx-background: -fx-control-inner-background ; 
    -fx-background-color: -fx-table-cell-border-color, -fx-background ; 
    -fx-background-insets: 0, 0 0 1 0 ; 
    -fx-table-cell-border-color: derive(-fx-color, 5%); 
} 
.table-row-cell:odd:filled:selected { 
    -fx-background: -fx-control-inner-background-alt ; 
} 
4

Ho appena colpito questo problema me stesso. Penso che il modo migliore per risolverlo sia fornire un'implementazione nulla di TableViewSelectionModel.

allora si può semplicemente dire implementazione nullo tableView.setSelectionModel(new NullTableViewSelectionModel(tableView));

Un campione è al di sotto ...

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TablePosition; 
import javafx.scene.control.TableView; 

public class NullTableViewSelectionModel extends TableView.TableViewSelectionModel { 

    public NullTableViewSelectionModel(TableView tableView) { 
     super(tableView); 
    } 

    @Override 
    public ObservableList<TablePosition> getSelectedCells() { 
     return FXCollections.emptyObservableList(); 
    } 

    @Override 
    public void selectLeftCell() { 

    } 

    @Override 
    public void selectRightCell() { 

    } 

    @Override 
    public void selectAboveCell() { 

    } 

    @Override 
    public void selectBelowCell() { 

    } 

    @Override 
    public void clearSelection(int i, TableColumn tableColumn) { 

    } 

    @Override 
    public void clearAndSelect(int i, TableColumn tableColumn) { 

    } 

    @Override 
    public void select(int i, TableColumn tableColumn) { 

    } 

    @Override 
    public boolean isSelected(int i, TableColumn tableColumn) { 
     return false; 
    } 

    @Override 
    public ObservableList<Integer> getSelectedIndices() { 
     return FXCollections.emptyObservableList(); 
    } 

    @Override 
    public ObservableList getSelectedItems() { 
     return FXCollections.emptyObservableList(); 
    } 

    @Override 
    public void selectIndices(int i, int... ints) { 

    } 

    @Override 
    public void selectAll() { 

    } 

    @Override 
    public void clearAndSelect(int i) { 

    } 

    @Override 
    public void select(int i) { 

    } 

    @Override 
    public void select(Object o) { 

    } 

    @Override 
    public void clearSelection(int i) { 

    } 

    @Override 
    public void clearSelection() { 

    } 

    @Override 
    public boolean isSelected(int i) { 
     return false; 
    } 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public void selectPrevious() { 

    } 

    @Override 
    public void selectNext() { 

    } 

    @Override 
    public void selectFirst() { 

    } 

    @Override 
    public void selectLast() { 

    } 
} 
+0

'isEmpty()' dovrebbe restituire true IMHO. – Mordechai

4

ho trovato here un'altra soluzione per lo stesso problema, ma per un ListView. Il modello è: ascolta l'evento di modifica della selezione, quindi deseleziona la selezione. Funziona anche per il TableView. Esempio di codice:

_tableView.getSelectionModel() 
       .selectedIndexProperty() 
       .addListener((observable, oldvalue, newValue) -> { 

     Platform.runLater(() -> { 
      _tableView.getSelectionModel().clearSelection(); 
     }); 

    }); 
9

È possibile disattivare la selezione, impostando selectionModel a null.

table.setSelectionModel(null); 
+3

Non si interrompe anche l'ordinamento nella tabella? – namlik

+0

L'ordinamento ha funzionato correttamente. – user3224416

+1

Gira per me con ListView con JavaFX 8, in che modo disabilitare la selezione? –