我正在使用这段代码尝试从组合框中删除get's selected的项,我想对它做进一步的处理,但问题是应该从列表中删除所选的值。以下是我用来填充下拉的内容
unpickedRoles = FXCollections.observableArrayList();
rollenDropdown.setItems(unpickedRoles);
unpickedRoles.addAll(Rol.DIRECTIE, Rol.MANAGER, Rol.MVOC, Rol.STAKEHOLDER);
@FXML
private void selectRol(ActionEvent event) {
Rol selected = rollenDropdown.getSelectionModel().getSelectedItem();
if (selected != null) {
rollenDropdown.getSelectionModel().clearSelection();
rollenDropdown.getItems().remove(selected);
}
}
现在,当一个选择与第一个不同时,每当调用代码get时,rollenDropdown.getSelectionModel().clearSelection();
函数似乎会在内部调用该代码,如果不调用javafx操作,我如何删除该选择?为什么只有在没有选择第一个的情况下才会发生这种情况?
编辑:这可能与一个项目被取消选择有关,从而回忆起方法
编辑2:添加空检查对没有帮助
亲切问候Jasper
如果您担心Platform.runLater执行操作的未指定时间,可以尝试以下方法。
这种方法有效地使用AnimationTimer在当前脉冲结束时运行所需的操作。
考虑到它可能的性能问题(在文档中提到(,我更喜欢只在多线程情况下使用Platform.runLater。
@FXML
private void selectRol(ActionEvent event) {
Rol selected = rollenDropdown.getSelectionModel().getSelectedItem();
if (selected != null) {
doEndOfPulse(() -> {
rollenDropdown.setValue(null);
rollenDropdown.getItems().remove(selected);
});
}
}
/**
* Executes the provided runnable at the end of the current pulse.
*
* @param runnable runnable to execute
*/
public static void doEndOfPulse(final Runnable runnable) {
new AnimationTimer() {
@Override
public void handle(final long now) {
runnable.run();
stop();
}
}.start();
}
根据如何从组合框中删除所选元素,我必须使用Platform.runLater()
,以确保在对选择进行任何操作之前处理好属性更改。这是工作代码:
@FXML
private void selectRol(ActionEvent event) {
Rol selected = rollenDropdown.getSelectionModel().getSelectedItem();
if (selected != null) {
Platform.runLater(() -> {
rollenDropdown.setValue(null);
rollenDropdown.getItems().remove(selected);
});
}
}