我正在尝试重置ComboBox
的选择,如下所示:
// private ListView<MyEntityType> f_lItems
f_lItems.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<?> ov, Object t, Object t1) {
if (t1 != null && t1 instanceof MyEntityType) {
MyEntityType pv = (MyEntityType) t1;
// do some condition testing
if (condition) {
// accept
} else
// roll back to previous item
f_lItems.getSelectionModel().select((MyEntityType) t);
}
}
}
});
因此,在尝试将列表重置为旧值后,我得到了这个例外:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(Unknown Source)
at javafx.collections.ListChangeListener$Change.getAddedSubList(Unknown Source)
at com.sun.javafx.scene.control.behavior.ListViewBehavior.lambda$new$177(Unknown Source)
at javafx.collections.WeakListChangeListener.onChanged(Unknown Source)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
在这种情况下,似乎我没有得到List
s / ObservableList
s的基本行为。
有没有人建议我如何才能做到这一点?
提前致谢 亚当
答案 0 :(得分:1)
根据你的评论你想要的是:当ComboBox
的(选定)值改变时,检查条件然后如果不满足这个条件,则设置{{1}的值前一个值。
为此,您可以使用带有侦听器的ComboBox的valueProperty。侦听器主体只是检查条件,值更新嵌套在ComboBox
块中。
示例强>
在示例中,它是Platform.runLater{...}
,只能设置为“2”。
ComboBox
...或者您也可以使用相同结构的selectedItemProperty ...
ComboBox<String> cb = new ComboBox<String>(FXCollections.observableArrayList("One", "Two", "Three", "Four"));
cb.valueProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// If the condition is not met and the new value is not null: "rollback"
if(newValue != null && !newValue.equals("Two")){
Platform.runLater(new Runnable(){
@Override
public void run() {
cb.setValue(oldValue);
}});
}
}
});
注意:此解决方案不是“阻止”选择,就像标题中所示:“回滚”已经执行的选择。