У меня есть TableView
с некоторыми строками. Пользователь может выбрать любую строку, но когда он нажимает на пустые строки или где-либо на Stage
, я хочу очистить его текущий выбор TableView
.Очистить выделение в виде таблицы при нажатии на пустые строки в javafx
5
A
ответ
2
Вы можете хранить последнюю выбранную строку и проверить с слушателя мыши на сцене, если щелчок был на выбранной строке или где-нибудь еще:
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();
}
}
}
});
2
Вы можете добавить фильтр событий для Scene
, который использует модель выбора в TableView
, чтобы очистить выбор, если щелчок был на пустой строке или в любом месте за пределами TableView
:
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();
}
});
большое спасибо за ваш ответ, но я получаю исключения нулевого указателя в строке stage.getScene(). addEventFilter (MouseEvent.MOUSE_CLICKED, new EventHandler() { –
Если у вас есть доступ к объекту 'scene', просто замените' stage.getScene() 'в приведенном выше коде символом' scene'. В противном случае взгляните на этот вопрос: http://stackoverflow.com/questions/30464238/javafx-getscene-returns-null – user7291698
да, у меня также был доступ к сцене. Сейчас он работает нормально. большое спасибо –