【问题标题】:How to do binding in FXML, in JavaFX 2?如何在 JavaFX 2 中的 FXML 中进行绑定?
【发布时间】:2013-11-12 18:09:54
【问题描述】:

Oracle 文档对此不是很清楚,google 和 bing 也不是。

我可以(如在 WPF 中)绑定到 FXML 中的模型跳过 Java 中的绑定代码吗?

我确实在某处的博客上看到过类似 ${object.field} 的语法,但我不能确定。


后期编辑:我从事 XAML 开发(WPF、Silverlight、Windows Phone)已有好几年了,而且我已经习惯于在标记中表达数据绑定。此外,我在a 2011 article on FXExperience 中读到过

我可以稍微扭转局面,将绑定移到 FXML 文档中。除了布局之外,这将允许工具处理数据绑定。请注意,由于 FXML 不支持双向绑定,因此以下代码目前无法使用,但我们正在努力解决此问题。

实际上是这样的:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import fxmlapp.Model ?>

<VBox fx:id="root" xmlns:fx="http://javafx.com/fxml" fx:controller="fxmlapp.Sample">
    <fx:define>
        <Model fx:id="model" />
    </fx:define>
    <children>
        <TextField fx:id="firstNameField" text="${model.person.firstName}" />
        <Label fx:id="messageLabel" text="${model.person.firstName}" />
    </children>
</VBox>

因为它是在 2011 年的一篇文章中,所以事情本来可以同时实施,但在这个方向上没有找到任何证据。因此,经过仔细搜索,我决定在这里问。

【问题讨论】:

  • 你能简要地定义你想要达到的目标吗?
  • 我希望“后期编辑”现在可以澄清一点。
  • 我还是不明白。 FXML 数据绑定在许多情况下与 XAML 非常相似(但没有那么强大,例如,没有“复杂”表达式绑定),您发布的示例就是这样工作的。你想知道什么?您想看一个在 FXML 中显示数据绑定的简单示例吗?
  • 不,FXML 尚不支持双向绑定。但是,您可以在代码中绑定双向。
  • 在代码中我知道该怎么做并且它有效。好吧,谢谢,这是一个有效的答案。你为什么不把它写成答案让我接受呢?

标签: data-binding javafx-2 markup fxml


【解决方案1】:

我正在挖掘这个线程,因为 A)它没有解决方案,并且 B)我是一个无耻的观点。

编辑:谈到原始问题,您的帖子完全正确,进行(单向)绑定,语法为 ${fx_id_value},与 OP 示例中所写的完全相同。 p>

在我看来,在 FXML 2.1 中添加了一些双向绑定的概念,根据 javafx.fxml.FXMLLoader#BI_DIRECTIONAL_BINDING_PREFIX

/**
 * Prefix for bidirectional-binding expression resolution
 * @since JavaFX 2.1
 */
public static final String BI_DIRECTIONAL_BINDING_PREFIX = "#{";

不幸的是,在此之后,我们实际上在javafx.fxml.FXMLLoader.Element#processPropertyAttribute 的第 318 行只有一次用法:

else if (isBidirectionalBindingExpression(value)) {
  throw constructLoadException(new UnsupportedOperationException("This feature is not currently enabled."));
}

执行a search on the javafx bug tracker 表明这个暴露的javadoc,引用#{ 作为符号,is a bug,应该被删除。在我看来,这似乎是正在进行中的事情。然而,考虑到 JavaFX 目前存在的无数错误,如果我们在 java 9 之前看不到它,我不会感到惊讶。

退后一步,您对文档的挫败感反映了我自己的情况(您的经历也是如此:我也是从 WPF 来到 JavaFX 的,因为我在这两个方面花费的时间比我怀疑的要少得多)。使用 javafx 绑定表达式的最佳解决方案来自阅读源代码到com.sun.javafx.fxml.expression.Expression(警告!关于 com.sun 包的通常规则适用:它们是内部的并且它们有奇怪的许可问题,请阅读该来源需要您自担风险!)。 Expression.java 类是一个手写的解析器/编译器,用于使用 FXML 的 javafx 绑定表达式,使用反射作为其运行时。为什么他们不使用 ANTLR 或 JavaCC 我不知道。如果我们只引用一个语法和一个监听器,那会更容易阅读。

通过阅读,我了解到您可以在 ${} 分隔符内使用表达式。对我来说最常见的是:

<HBox>
  <CheckBox fx:id="abcCheckBox"/>
  <TextField disable="${ ! abcCheckBox.selected}"/>
</HBox>

类似于 XAML。它还支持加法、否定和其他常见事物,只要所有内容都引用 fx:id 的组件和属性(并且“控制器”是一个 fx:id 提供给您免费引用此 XML 的控制器)加载到)。

考虑到所有因素,我喜欢 javafx,但要获得像 C#、WPF、XAML 和 caliburn-micro 提供的深度绑定和集成功能还需要一段时间。

【讨论】:

  • 我们现在在 Java 14 中,这仍然没有修复。
  • 是的@Andez 看起来 JavaFX 将是一个相当不错但开发不足的 UI 框架。 FXML 的许多关键问题已经得到解决,但与 XAML 相比,它的可用性仍然很低。在这一点上,我认为我的大部分 UI 将在 tornadofx.io 中完成,这很好,但 WYSISYG 编辑器(需要 FXML)非常适合我们的流程(阅读:讨论和模拟事物)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2014-06-15
  • 2014-07-25
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多