仅用于用户更改的 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;
}
}
我尝试在 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;
}
}