JavaFX ComboBox OnChangeListener 回滚更改
Posted
技术标签:
【中文标题】JavaFX ComboBox OnChangeListener 回滚更改【英文标题】:JavaFX ComboBox OnChangeListener rollback change 【发布时间】:2016-10-22 05:18:22 【问题描述】:我正在尝试重置 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 的基本行为。
有人对我如何使这项工作提出建议吗?
提前致谢 亚当
【问题讨论】:
您所说的“重置ComboBox
的选择究竟是什么意思?您是否希望ComboBox
在您每次选择另一个时都有默认选择的项目?
你想做什么?举个例子,用这种方法你可以有 ***Error 错误...
假设选择的索引是 4。用户已将索引设置为 6。在更改的处理程序中,由于某些内部原因,我想将索引设置回 4。其实我想实现“你真的确定要改变你的选择”的事情。另一方面,我认为无论如何这都不应该是正确的方法。也许我必须首先阻止更改的事件。
【参考方案1】:
根据您的评论,您想要的是:当ComboBox
的(选定)值发生更改时,检查一个条件,然后如果不满足此条件,则将ComboBox
值的值设置回上一个。
为此,您可以将 ComboBox 的 valueProperty 与侦听器一起使用。侦听器主体只是检查条件,值更新嵌套在Platform.runLater...
块中。
示例
在示例中,它是一个ComboBox
,只能设置为“Two”。
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);
);
);
...或者您也可以使用具有相同结构的selectedItemProperty ...
cb.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal)->
if(newVal != null && !newVal.equals("Two"))
Platform.runLater(() -> cb.setValue(oldVal));
);
注意:此解决方案不是“阻止”选择,正如标题中的:“回滚”已执行的选择。
【讨论】:
这正是我想要的。谢谢!以上是关于JavaFX ComboBox OnChangeListener 回滚更改的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?
可编辑 JavaFX ComboBox 上的 MouseListener
如何将 JavaFX ComboBox 中的选择转换为字符串