首页 文章

禁用TableView中的行选择

提问于
浏览
7

我在JavaFX 8中有一个只读的TableView,我不会让用户选择行 .
他们仍然应该能够对列进行排序并滚动,而不是选择任何行 .
我怎样才能做到这一点?

4 回答

  • 4

    过了一会儿,我发现了如何解决它,所以在这里发布给未来的用户 .
    解决方案基于这个答案:JavaFX8 - Remove highlighting of selected row

    将以下行添加到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 ;
    }
    
  • 5

    您可以通过将 selectionModel 设置为 null 来禁用选择 .

    table.setSelectionModel(null);
    
  • 10

    我自己就是这个问题 . 我认为解决它的最佳方法是提供TableViewSelectionModel的null实现 .

    然后你可以简单地说 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() {
    
        }
    }
    
  • 8

    我找到了here针对同一问题的另一种解决方案,但对于ListView . 模式是:监听选择更改事件,然后清除选择 . 它也适用于TableView . 代码示例:

    _tableView.getSelectionModel()
                   .selectedIndexProperty()
                   .addListener((observable, oldvalue, newValue) -> {
    
            Platform.runLater(() -> {
                _tableView.getSelectionModel().clearSelection();
            });
    
        });
    

相关问题