Отключить выделение строк в TableView

У меня есть только для чтения TableView в JavaFX 8, и я не хочу, чтобы пользователи выбирали строки.
Они все равно должны иметь возможность сортировать столбцы и прокручивать, а не выбирать строки.
Как я могу достичь этого?

4 ответов


через некоторое время я нашел как ее решить, поэтому размещать его здесь для будущих пользователей.
Решение основано на этом ответе: JavaFX8-удалить выделение выбранной строки

после добавления следующих строк в ваш css выбранные строки будут выглядеть точно так же, как невыбранные строки, достигая того же эффекта, который я хотел в том же месте:

.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 ;
}

вы можете отключить выделение, установив selectionModel to null.

table.setSelectionModel(null);

нашел здесь другое решение для той же проблемы, но для ListView. Шаблон: прослушайте событие изменения выбора, а затем очистите выбор. Он также работает для TableView. Пример кода:

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

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

    });

Я только что сам попал в эту проблему. Я думаю, что лучший способ решить это-предоставить нулевую реализацию TableViewSelectionModel.

затем вы можете просто сказать tableView.setSelectionModel(new NullTableViewSelectionModel(tableView));

ниже приведен пример реализации null...

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

    }
}