12

オラクルのドキュメントは、これについてはあまり明確ではありません。グーグルとビングもそうではありません。

(WPF のように) Java のバインディング コードをスキップして FXML のモデルにバインドできますか?

${object.field} のような構文をどこかのブログで簡単に見ましたが、確かではありません。


LATER EDIT:私はXAML開発(WPF、Silverlight、Windows Phone)をかなりの年にわたって行っており、マークアップでデータバインディングを表現することに慣れてきました。さらに、FXExperience に関する 2011 年の記事を読みました

状況を少し変えて、バインディングを 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 年の記事にあったので、その間に実装されていた可能性がありますが、この方向での証拠は見つかりませんでした。ですので、よく調べた結果こちらで質問することにしました。

4

1 に答える 1

17

A) 解決策がなく、B) 私は恥知らずな点泥棒なので、このスレッドを掘り下げています。

編集:元の質問に言えば、あなたの投稿は正確に正しいです.(一方向)バインディングを行うには、構文は${fx_id_value}、OPの例に書かれているとおりです。

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 = "#{";

残念ながら、それを少し遡ると、 の 318 行目で事実上 1 つの使用法しかありませんjavafx.fxml.FXMLLoader.Element#processPropertyAttribute

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

javafxバグ トラッカーで検索を#{行うと、シンボルとして参照しているこの公開された javadocはバグであり、削除する必要があることがわかります。これは私には進行中の何かのように思えます。しかし、現在 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 化されたコンポーネントとそれらのプロパティを参照している限り、追加、否定、およびその他の一般的なこともサポートします (そして、「コントローラー」は、この XML が実行されているコントローラーを参照するために自由に与えられる fx:id です)。にロードされます)。

すべてを考慮すると、私は javafx が好きですが、C#、WPF、XAML、caliburn-micro などのディープ バインディングと統合機能が提供されるまでにはしばらく時間がかかります。

于 2015-11-16T02:50:21.507 に答える