【问题标题】:Binding.scala FXML: How to populate an ObservableList propertyBinding.scala FXML:如何填充 ObservableList 属性
【发布时间】:2017-10-26 23:07:24
【问题描述】:

我有这样的代码:

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>

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

【问题讨论】:

    标签: scala javafx binding.scala


    【解决方案1】:

    根据the specification of FXML

    只读列表属性是一个 Bean 属性,其 getter 返回 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

    【讨论】:

    • 谢谢。如果我有 BindingSeq 而不是 Seq 怎么办?
    • 我想我可以做.all.bind 然后换行?
    • .all.bind 编译但失去部分更新能力
    • 对,所以理想情况下,应该有一些东西可以将 BindingSeq 转换为 ObservableList,从而保留部分更新行为
    • IIRC,有从 SeqBindingSeqObservableList 的自动转换。如果它不起作用,您能否最小化您的示例并在 Binding.scala 的问题跟踪器上报告它?
    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多