我有这样的代码:
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>
生成项目的正确方法是什么?
根据FXML的规范:
只读列表属性是一个 Bean 属性,其 getter 返回
java.util.List
的实例,并且没有相应的 setter 方法。只读列表元素的内容在处理时会自动添加到列表中。
items
是SavedSearchCmb
的列表属性,但是,它不是只读的,因为有一个 setter setItems。因此,以前版本的 Binding.scala 确实将savedSearches
的内容追加到items
属性,而是尝试通过setItems
将Constants
分配给items
。
也就是说,根据规范,Binding.scala 之前的行为是提取正确的。
FXML 行为非常不方便。
幸运的是,Binding.scala不必支持Oraclejavafx.fxml.FXMLLoader
的提取相同的语法。
我决定打破规范,允许将数据绑定表达式的内容附加到任何列表属性,无论它是否是只读的。
此更改已包含在 Binding.scala 11.0.1 中。如果升级到 Binding.scala 11.0.1,则代码应编译。
我们可以比原来的FXML规范做得更好。这就是为什么你选择Binding.scala而不是javafx.fxml.FXMLLoader
。