gpt4 book ai didi

data-binding - 如何在 JavaFX 2 中的 FXML 中进行绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 02:10:00 26 4
gpt4 key购买 nike

甲骨文文档对此不是很清楚,谷歌和必应也不是。

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

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

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

I could turn things around a little bit and move the binding into the FXML document. This would allow tools to handle data binding in addition to layout. Note that the following code does not work today because bidirectional bindings are not supported in FXML, but we are working on fixing that.



实际上它就像:
<?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 年的一篇文章中,所以事情本可以同时实现,但在这个方向上没有找到任何证据。因此,经过仔细搜索,我决定在这里问。

最佳答案

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

编辑:谈到原来的问题,你的帖子是完全正确的,做一个(单向)绑定(bind),语法是 ${fx_id_value} ,完全按照OP的示例中所写。

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

/**
* 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 才看到它,我不会感到惊讶。

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

通过阅读,我了解到您可以在 ${ 中使用表达式。和 }分隔符。对我来说最常见的是:
<HBox>
<CheckBox fx:id="abcCheckBox"/>
<TextField disable="${ ! abcCheckBox.selected}"/>
</HBox>

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

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

关于data-binding - 如何在 JavaFX 2 中的 FXML 中进行绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com