仅用于用户更改的 JavaFX Combobox 侦听器

JavaFX Combobox listener for user changes only

我尝试在 ComboBox 上实现一个侦听器,用于验证用户的选择并在选择无效时将其重置为之前的值。

我现在的问题是 valueProperty 或 selectedItemProperty 上的侦听器也可以识别以编程方式进行的更改,例如当用户选择另一个实体时,该实体随后会更改 ComboBox 值。

有什么方法可以实现只监听用户提交的更改的监听器吗?

        stateComboBox.valueProperty().addListener(new ChangeListener<State>() {

        @Override
        public void changed(ObservableValue<? extends State> observable, State oldValue,
                State newValue) 
        {
            if(stateCheckActive==false) return;
            if(newValue==null||oldValue.equals(newValue)) return;

            currentDocument.getBean().setStatus(oldValue);      

            if(service.changeStateAllowed(currentDocument.getBean(), newState.getId().getNr(), true))
            {
                stateCheckActive=false;

                newDocument=service.updateDocument(currentDocument.getBean());
                currentDocument.setBean(newDocument);

                stateCheckActive=true;
            }
            else 
            {
                Platform.runLater(new Runnable() {

                    @Override
                    public void run() 
                    {
                        stateCheckActive=false;
                        statusComboBox.setValue(oldValue);
                        stateCheckActive=true;
                    }
                });

            }

        }
    });

你需要这样的东西吗?

public class Controller implements Initializable {

    @FXML
    private ComboBox<String> comboBox;

    private ChangeListener<? super String> listener = (observable, oldValue, newValue) -> {
        if (!newValue.matches("[A-Z]*")) { // put your validation here
            comboBox.getSelectionModel().selectedItemProperty().removeListener(getListener());
            Platform.runLater(() -> {
                comboBox.getSelectionModel().select(oldValue);
                comboBox.getSelectionModel().selectedItemProperty().addListener(getListener());
            });
        }
    };

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        ObservableList<String> items = FXCollections.observableArrayList();
        items.add("VALID");
        items.add("MATCHES");
        items.add("NotMatches");
        items.add("RandomValue");
        comboBox.setItems(items);
        comboBox.getSelectionModel().select(0);
        comboBox.getSelectionModel().selectedItemProperty().addListener(getListener());
    }

    private ChangeListener<? super String> getListener() {
        return listener;
    }

}