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