2017-08-14 62 views
0

我有一个cuttingOperationComboBox组合框和改变这种组合框的项目和值的方法:JavaFX的属性更改侦听器:空NEWVALUE

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为空。而且它只有在ComboBox可见时才会发生。 Tobe更精确:cuttingOperationComboBox作为TreeCell图形的一部分显示在TreeView中。只要包含组合框的树视图节点被折叠,一切都可以,但是当我展开此节点并显示组合框时,就会出现上述问题。 有人知道我在做什么错?

回答

0

每当您拨打ComboBox(或涉及物品列表的其他控件)的setItems()时,ComboBox(或相应控件)将始终清除所有选择。我相信这是由底层selection model引起的行为,我认为这是大多数使用情况下的理想行为。

不知道你到底在做什么,很难给你一个确切的解决方案。如果您只是想在设置新列表后保留该值,则可能需要保留旧选择项的副本,然后手动将其设置在setItems()之后。如果您不希望ChangeListenersetItems()作出响应,请在侦听器中检查nullnewValue,或在某处保留一个布尔标志,以告知侦听器该特定调用是由setItems()触发的。

+0

感谢您的回复。我想要做的只是更改组合框的项目,并保留当前值,如果它是新列表的元素。为了避免上面的问题与空newValue我检查之前采取任何行动在chnage监听器,就像你提出的。现在一切正常,但我只是好奇,为什么newValue有时是空的,而它应该不是。至少我认为是这样,但我可能是错误的,ComboBox类中有些东西我不明白。 – aban

+0

@aban就像我说的,当你调用'setItems()'时,你告诉'ComboBox':“嘿,我给你一个全新的列表。”会发生什么情况是'ComboBox'会假设你原来选择的值不再正确(因为该值甚至可能不会出现在你的新列表中),所以它会清除该值,导致值变为null。 – Jai