2014-12-08 96 views
6

我在JavaFX 8中有一个只读TableView,我不希望用户选择行。
他们应该仍然能够对列进行排序并滚动,而不是选择任何行。
我该如何做到这一点?在TableView中禁用行选择

+0

从技术上讲,您可以null selectionModel - 可能会禁用导航,虽然(现在不能尝试)。另外,复制也是不可能的。好奇:你为什么想要减少用户体验? – kleopatra 2014-12-08 11:28:18

+1

@kleopatra将SelectionModel设置为null将在用户对列进行排序时引发异常。 – BioRoy 2014-12-09 12:54:11

+1

有用的知识,感谢信息:-)听起来像一个bug(null selectionModel是一个有效的值),所以提出了一个问题:https://javafx-jira.kenai.com/browse/RT-39624 – kleopatra 2014-12-09 14:14:32

回答

7

经过一段时间,我发现如何解决它,所以张贴在这里为未来的用户。
该解决方案是基于这样的回答: 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 ; 
} 
4

我刚刚碰到这个问题。我认为解决它的最好方法是提供一个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() { 

    } 
} 
+0

'isEmpty()'应该返回真实的恕我直言。 – Mordechai 2017-09-13 16:01:46

4

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

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

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

    }); 
9

您可以禁用选择,通过设置selectionModelnull

table.setSelectionModel(null); 
+3

这是不是在表中排序呢? – namlik 2016-05-19 06:54:57

+0

排序工作正常。 – user3224416 2016-05-22 08:57:51

+1

它与JavaFX 8的ListView引发我的任何方式来禁用选择? – 2017-02-17 03:56:07