我有一些行的TableView
。用户可以选择任何行,但是当他单击空行或Stage
上的任何位置时,我想清除他对TableView
的当前选择。
最佳答案
您可以存储最后选择的行,并在场景中使用鼠标监听器检查单击是否在所选行或其他位置:
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();
}
}
}
});