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)

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

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

提前致谢 亚当

【问题讨论】:

您所说的“重置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 中的选择转换为字符串

javafx 创建 ComboBox TableCell

如何为 JavaFX 中的 ComboBox 中的项目添加值

javafx fxml ComboBox错误