在TableView JavaFX中选择

时间:2016-10-28 22:45:50

标签: javafx

如何通过单击列名来选择所有列, 我发现如何选择多个列或一行,但我想要的是一次点击=全部选择像这个图像

Excel exemple

当我点击A并选择整个列时。

1 个答案:

答案 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;
}