以编程方式清除选择时调用组合框操作
Combobox action get's called when programmatically clearing selection
我正在使用这段代码尝试删除从组合框中选择的项目,我想用它做一些进一步的事情,但问题是选择的值应该从列表中删除。以下是我用来填充下拉列表的内容
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);
}
}
现在,无论何时在进行与第一个选择不同的选择时调用代码,代码似乎都会被 rollenDropdown.getSelectionModel().clearSelection();
函数在内部调用,我如何在不调用 javafx 操作的情况下删除选择?为什么只有在不选择第一个时才会出现这种情况?
编辑:它可能与取消选择的项目有关,从而召回该方法
编辑 2:添加空检查没有帮助
亲切的问候
碧玉
根据 ,我必须使用 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);
});
}
}
如果您担心 Platform.runLater 执行操作的时间不确定,您可以尝试以下方法。
此方法有效地使用 AnimationTimer 到 运行 当前脉冲结束时的所需操作。
考虑到它可能存在的性能问题(在doc中提到),我宁愿只在多线程情况下使用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();
}
我正在使用这段代码尝试删除从组合框中选择的项目,我想用它做一些进一步的事情,但问题是选择的值应该从列表中删除。以下是我用来填充下拉列表的内容
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);
}
}
现在,无论何时在进行与第一个选择不同的选择时调用代码,代码似乎都会被 rollenDropdown.getSelectionModel().clearSelection();
函数在内部调用,我如何在不调用 javafx 操作的情况下删除选择?为什么只有在不选择第一个时才会出现这种情况?
编辑:它可能与取消选择的项目有关,从而召回该方法
编辑 2:添加空检查没有帮助
亲切的问候 碧玉
根据 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);
});
}
}
如果您担心 Platform.runLater 执行操作的时间不确定,您可以尝试以下方法。
此方法有效地使用 AnimationTimer 到 运行 当前脉冲结束时的所需操作。
考虑到它可能存在的性能问题(在doc中提到),我宁愿只在多线程情况下使用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();
}