我在JavaFX 8中有一个只读的TableView,我不会让用户选择行 .他们仍然应该能够对列进行排序并滚动,而不是选择任何行 .我怎样才能做到这一点?
过了一会儿,我发现了如何解决它,所以在这里发布给未来的用户 .解决方案基于这个答案: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 ; }
您可以通过将 selectionModel 设置为 null 来禁用选择 .
selectionModel
null
table.setSelectionModel(null);
我自己就是这个问题 . 我认为解决它的最佳方法是提供TableViewSelectionModel的null实现 .
然后你可以简单地说 tableView.setSelectionModel(new NullTableViewSelectionModel(tableView));
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() { } }
我找到了here针对同一问题的另一种解决方案,但对于ListView . 模式是:监听选择更改事件,然后清除选择 . 它也适用于TableView . 代码示例:
_tableView.getSelectionModel() .selectedIndexProperty() .addListener((observable, oldvalue, newValue) -> { Platform.runLater(() -> { _tableView.getSelectionModel().clearSelection(); }); });
4 回答
过了一会儿,我发现了如何解决它,所以在这里发布给未来的用户 .
解决方案基于这个答案:JavaFX8 - Remove highlighting of selected row
将以下行添加到css后,选定的行将看起来与未选择的行完全相同,在同一位置实现我想要的相同效果:
您可以通过将
selectionModel
设置为null
来禁用选择 .我自己就是这个问题 . 我认为解决它的最佳方法是提供TableViewSelectionModel的null实现 .
然后你可以简单地说
tableView.setSelectionModel(new NullTableViewSelectionModel(tableView));
下面的示例null实现如下......
我找到了here针对同一问题的另一种解决方案,但对于ListView . 模式是:监听选择更改事件,然后清除选择 . 它也适用于TableView . 代码示例: