You can save the last selected line and check with the mouse on the scene if the click was in the selected line or somewhere else:
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(); } } } });
source share