2017-05-26 40 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'编译但失去了部分更新的能力 –