2017-08-14 39 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