17

I have a read-only TableView in JavaFX 8, and I don't want' the users to select rows.
They should still be able to sort the columns and scroll, just not to select any rows.
How can I achieve this?

BioRoy
  • 375
  • 1
  • 3
  • 10
  • technically, you could null the selectionModel - might disable navigation, though (can't try right now). Also, copy would not be possible. Curious: why do you want to detoriate user experience? – kleopatra Dec 08 '14 at 11:28
  • 1
    @kleopatra Setting the SelectionModel to null will throw exceptions when the user sorts the columns. – BioRoy Dec 09 '14 at 12:54
  • 1
    good to know, thanks for the info :-) Sounds like a bug to me (null selectionModel is a valid value), so filed an issue: https://javafx-jira.kenai.com/browse/RT-39624 – kleopatra Dec 09 '14 at 14:14

4 Answers4

17

You can disable selection, by setting selectionModel to null.

table.setSelectionModel(null);
Roy Shmuli
  • 4,979
  • 1
  • 24
  • 38
user3224416
  • 522
  • 5
  • 15
11

After a while I found how to solve it so posting it here for future users.
The solution is based on this answer: JavaFX8 - Remove highlighting of selected row

After adding the following lines to your css, selected lines will look exactly as unselected lines, achieving the same effect I wanted in the same place:

.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 ;
}
BioRoy
  • 375
  • 1
  • 3
  • 10
6

I've just hit this issue myself. I think the best way to solve it is to provide a null implementation of TableViewSelectionModel.

Then you can simply say tableView.setSelectionModel(new NullTableViewSelectionModel(tableView));

A sample null implementation is below...

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() {

    }
}
Phil Anderson
  • 3,146
  • 13
  • 24
5

I found here another solution for the same problem but for a ListView. The pattern is: listen the selection change event, and then clear the selection. It works also for the TableView. Code example:

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

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

    });
tino
  • 221
  • 3
  • 4