【问题标题】:JavaFX ComboBox OnChangeListener rollback changeJavaFX ComboBox OnChangeListener 回滚更改
【发布时间】: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)

对于这种情况,我似乎没有得到Lists / ObservableLists 的基本行为。

有人对我如何使这项工作提出建议吗?

提前致谢 亚当

【问题讨论】:

  • 您所说的“重置ComboBox 的选择究竟是什么意思?您是否希望ComboBox 在您每次选择另一个时都有默认选择的项目?
  • 你想做什么?举个例子,用这种方法你可以有 StackOverflowError 错误...
  • 假设选择的索引是 4。用户已将索引设置为 6。在更改的处理程序中,由于某些内部原因,我想将索引设置回 4。其实我想实现“你真的确定要改变你的选择”的事情。另一方面,我认为无论如何这都不应该是正确的方法。也许我必须首先阻止更改的事件。

标签: java javafx combobox listener


【解决方案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));
    }
});

注意:此解决方案不是“阻止”选择,正如标题中的:“回滚”已执行的选择。

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2020-01-12
  • 2015-05-31
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多