以编程方式清除选择时调用组合框操作

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();
}