Javafx Combox onChangelistener回滚更改

 2023-02-17    437  

问题描述

我正在尝试重置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);
            }
        }
    }
});

因此,在尝试将列表重置为旧值之后,我得到了这个例外:

Javafx Combox onChangelistener回滚更改

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)

似乎我没有得到这种情况的基本行为.

有人有建议我如何完成这项工作?

预先感谢
亚当

推荐答案

根据您的评论,您想要的是:当更改ComboBox的(选择)值时,检查条件,然后如果不满足此条件,请恢复对前一个的值.

为此,您可以使用 combobox的valueproperty与听众.听众主体只是为了检查条件,值更新嵌套在Platform.runLater{…}块中.

示例

在示例中,它是ComboBox,只能设置为”两个”.

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 Combox onChangelistener回滚更改,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34138.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。