2017-05-26 39 views
1

我有這樣的代碼:Binding.scala FXML:如何填充一個ObservableList財產

val state = Var(initialState) 

// ... 
type SavedSearchCmb = ComboBox[SavedSearch] 
val savedSearchesCmb: Binding[SavedSearchCmb] = 
    <SavedSearchCmb> 
    <items> 
     {state.bind.savedSearches} 
    </items> 
    </SavedSearchCmb> 

編譯器會抱怨,

[error] found : Seq[com.dev1on1.timer.YouTrackAPI.SavedSearch] 
[error] required: javafx.collections.ObservableList[com.dev1on1.timer.YouTrackAPI.SavedSearch] 
[error]   <items> 

什麼是生成項目的正確方法?

回答

1

根據the specification of FXML

只讀列表屬性是一個Bean屬性,其吸氣劑返回java.util.List一個實例,並沒有相應的setter方法。只讀列表元素的內容在處理時會自動添加到列表中。

itemsSavedSearchCmb列表屬性,但是,它不是只讀因爲有一個setter setItems。因此,以前版本的Binding.scala將savedSearches的內容附加到items屬性,而是嘗試通過setItemsConstants分配給items

也就是說,Binding.scala以前的行爲是根據規範抽取正確的。


FXML行爲非常不方便。

幸運的是,Binding.scala不必支持Oracle的javafx.fxml.FXMLLoader的抽象相同的語法。

我決定打破規範,允許將數據綁定表達式的內容附加到任何列表屬性,而不管它是否只讀。

更改已包含在Binding.scala 11.0.1中。如果您升級到Binding.scala 11.0.1,您的代碼應該編譯。

我們可以做得比原來的FXML規範更好。這就是爲什麼你選擇Binding.scala而不是javafx.fxml.FXMLLoader

+0

謝謝。如果不是一個Seq我有一個'BindingSeq'? – nafg

+0

我想我可以做'.all.bind'然後換行? – nafg

+0

'.all.bind'編譯但失去了部分更新的能力 –