1

我有这样的代码:

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>

生成项目的正确方法是什么?

4

1 回答 1

1

根据FXML 的规范

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

items是 的列表属性SavedSearchCmb,但是,它不是只读的,因为有一个设置器setItems。因此,以前版本的 Binding.scala 确实将 的内容附加savedSearchesitems属性,而是尝试将 分配Constantsitemsvia setItems

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

于 2017-05-26T06:38:10.233 回答