答案 0 :(得分:0)
您可以替换TableColumnHeader
的事件处理程序。通过此监听器,您可以使用TableView
的选择模型选择整个列。如果您还希望选中列的空单元格,则可以将样式类添加到所选列:
private static final String selectedStyleClass = "selected";
@Override
public void start(Stage primaryStage) {
TableView<Item<String>> tableView = createTable();
// set selection mode to multi-cell-selection
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableView.getSelectionModel().setCellSelectionEnabled(true);
// make sure the table skin is created
Scene scene = new Scene(tableView);
tableView.applyCss();
tableView.layout();
// clear column selection on change of selected cells
tableView.getSelectionModel().getSelectedCells().addListener((Observable v) -> clearSelections(tableView));
tableView.lookupAll("TableColumnHeader").stream().forEach(h -> {
final TableColumnHeader header = (TableColumnHeader) h;
header.setOnMouseReleased(evt -> {
evt.consume();
// select the whole column
tableView.getSelectionModel().selectRange(0, header.getTableColumn(), tableView.getItems().size() - 1, header.getTableColumn());
// add style class for styling empty cells in selected column
List<String> style = header.getTableColumn().getStyleClass();
if (!style.contains(selectedStyleClass)) {
style.add(selectedStyleClass);
}
});
});
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
private static void clearSelections(TableView<?> tableView) {
for (TableColumn column : tableView.getColumns()) {
column.getStyleClass().remove(selectedStyleClass);
}
}
<强>的style.css 强>
.table-view:focused .table-cell:empty.selected {
-fx-background: -fx-selection-bar;
-fx-table-cell-border-color: derive(-fx-selection-bar, 20%);
}
.table-view .table-cell:empty.selected {
-fx-background: -fx-selection-bar-non-focused;
-fx-table-cell-border-color: derive(-fx-selection-bar-non-focused, 20%);
-fx-background-color: -fx-table-cell-border-color, -fx-background;
-fx-background-insets: 0, 0 0 1 0;
}