【问题标题】:JavaFX property change listener: null newValueJavaFX 属性更改侦听器:null newValue
【发布时间】:2017-08-14 16:13:44
【问题描述】:

我有一个cuttingOperationComboBox ComboBox 和一个更改此 ComboBox 的项目和值的方法:

public void changeGlass(Glass newGlass)
{
    ObservableList<Operation> list = new FilteredList<Operation>(ProductGlassCuttingUI.this.operationsDB.getOperationsList(), operation -> operation.getOperationType().toString().equals("RE") &&
            operation.getGlassThickness() == newGlass.getGlassThickness());

    if(!list.contains(this.cuttingOperationComboBox.getValue()))
        cuttingOperationComboBox.setValue(list.get(0));
    cuttingOperationComboBox.setItems(list);
}

我还将更改侦听器添加到 cuttingOperationComboBox.valueProperty()cuttingOperationComboBox.setValue(list.get(0)); 第一次触发它,这里一切都很好。但是当cuttingOperationComboBox.setItems(list); 触发更改侦听器时,尽管list 不为空,但其中的newValue 为null。此外,它仅在 ComboBox 可见时发生。更准确地说:cuttingOperationComboBox 在 TreeView 中显示为 TreeCell 图形的一部分。只要包含组合框的树视图节点折叠一切都可以,但是当我展开此节点并显示组合框时,就会出现上述问题。 有人知道我做错了什么吗?

【问题讨论】:

    标签: java javafx combobox


    【解决方案1】:

    当您调用ComboBox(或其他涉及项目列表的控件)的setItems() 时,ComboBox(或相应的控件)将始终清除所有选择。我相信这是由底层 selection model 引起的行为,我相信这是大多数用例所期望的行为。

    如果不确切知道您要实现的目标,就很难为您提供准确的解决方案。如果您只是想在设置新列表后保留该值,那么您可能需要保留旧选择项的副本,然后在setItems() 之后手动设置它。如果您不希望 ChangeListener 响应 setItems(),请在侦听器中检查 null newValue,或者在某处保留一个布尔标志,以告知侦听器特定呼叫是由 @987654330 触发的@。

    【讨论】:

    • 感谢您的回复。我想要做的只是更改组合框的项目并保留当前值,如果它是新列表的元素。为了避免 null newValue 的上述问题,我在 chnage 侦听器中采取任何操作之前检查它,就像你建议的那样。现在一切正常,但我只是好奇为什么 newValue 有时为空,而它不应该为空。至少我是这么认为的,但我可能错了,ComboBox 类中有一些我不明白的东西。
    • @aban 就像我说的,当你打电话给setItems() 时,你是在告诉ComboBox“嘿,我给你一个全新的名单。”发生的情况是ComboBox 将假定您最初选择的值不再正确(因为该值甚至可能不在您的新列表中),因此它将清除该值,导致值更改为null
    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多