Binding.scala FXML:如何填充ObservableList属性

时间:2017-05-26 06:31:13

标签: scala javafx binding.scala

我有这样的代码:

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 个答案:

答案 0 :(得分:1)

根据the specification of FXML

  

只读列表属性是Bean属性,其getter返回java.util.List的实例,并且没有相应的setter方法。只读列表元素的内容会在处理时自动添加到列表中。

itemsSavedSearchCmb的列表属性,但是,它不是只读,因为有一个setter setItems。因此,以前版本的Binding.scala确实会将savedSearches的内容附加到items属性,而是尝试通过{Constantsitems分配给setItems {1}}。

也就是说,根据规范,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