单击javafx中的空行时,在表视图中清除选择

Anu*_*rma 5 javafx tableview

我有TableView一些行.用户可以选择任何行,但当他点击空行或任何地方时Stage,我想清除他当前的选择TableView.

fab*_*ian 5

如果单击的是空行或 之外的任何位置,您可以向 中添加一个事件过滤器,Scene该事件过滤器使用 的选择模型来清除选择:TableViewTableView

scene.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
    Node source = evt.getPickResult().getIntersectedNode();

    // move up through the node hierarchy until a TableRow or scene root is found 
    while (source != null && !(source instanceof TableRow)) {
        source = source.getParent();
    }


    // clear selection on click anywhere but on a filled row
    if (source == null || (source instanceof TableRow && ((TableRow) source).isEmpty())) {
        tableView.getSelectionModel().clearSelection();
    }
});
Run Code Online (Sandbox Code Playgroud)


use*_*698 3

您可以存储最后选定的行,并使用场景上的鼠标侦听器检查单击是否在选定的行或其他位置:

    ObjectProperty<TableRow<MyRowClass>> lastSelectedRow = new SimpleObjectProperty<>();

    myTableView.setRowFactory(tableView -> {
        TableRow<MyRowClass> row = new TableRow<MyRowClass>();

        row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
            if (isNowSelected) {
                lastSelectedRow.set(row);
            } 
        });
        return row;
    });


    stage.getScene().addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            if (lastSelectedRow.get() != null) {
                Bounds boundsOfSelectedRow = lastSelectedRow.get().localToScene(lastSelectedRow.get().getLayoutBounds());
                if (boundsOfSelectedRow.contains(event.getSceneX(), event.getSceneY()) == false) {
                    myTableView.getSelectionModel().clearSelection();
                }
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)