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

时间:2018-01-31 10:06:28

标签: javafx javafx-8

我尝试在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;
                    }
                });

            }

        }
    });

1 个答案:

答案 0 :(得分:0)

你需要这样的东西吗?

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

}