JavaFX ComboBox OnChangeListener回滚更改

时间:2016-06-20 20:22:25

标签: java javafx combobox listener

我正在尝试重置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的基本行为。

有没有人建议我如何才能做到这一点?

提前致谢 亚当

1 个答案:

答案 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);
                }});
        }
    }
});

注意:此解决方案不是“阻止”选择,就像标题中所示:“回滚”已经执行的选择。