【发布时间】:2018-01-31 10:06:28
【问题描述】:
我尝试在 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;
}
});
}
}
});
【问题讨论】:
-
你能提供一些代码吗?
-
没有 .. 你为什么需要它?程序化的改变只产生有效的改变,所以不管验证器是否在运行,它都会通过
-
问题是一个有效值会触发对数据库的更新并重新加载实体,这会导致死锁,因为 ComboBox 值再次更改。我想我可能会尝试使用标志,因为似乎没有用户选择事件。
-
听起来您未显示的代码有问题 - 请阅读 stackoverflow.com/help/mcve 并采取相应措施