ドキュメント



JavaFX: FXMLの習得

2 JavaFXリリース2.1および2.2でのFXMLの拡張機能

この章は、JavaFXリリース2.1および2.2で導入されたFXMLの拡張機能について説明する次の項で構成されています。また、以前のリリースとの非互換性についても説明します。

JavaFX 2.1および2.2で導入されたFXMLの拡張機能

JavaFX 2.1およびJavaFX 2.2では、次のようなFXMLの拡張機能が追加されました。

  • エスケープ文字としての先行バックスラッシュの使用のサポート(RT-18680)

    JavaFX 2.0では、エスケープ文字として$$などの連続した演算子文字が使用されていました。JavaFX 2.1では、\$などのバックスラッシュ文字を使用したエスケープ・シーケンスのサポートが追加されています。このようなエスケープ・シーケンスは、開発者がよく使用するUnified Expression Language (UEL)に似ています。JavaFX 2.0のエスケープ・シーケンスは、JavaFX 2.1で非推奨になりました。「JavaFX 2.1で非推奨になった一部のJavaFX 2.0 FXMLエスケープ・シーケンス」および「エスケープ文字になったバックスラッシュ」を参照してください。

  • コントローラで名前空間をドキュメント化するための暗黙的変数

    この新機能によって、コントローラとUI間の双方向バインディングが簡単になります。双方向バインディングはJavaFX 2.1から削除されましたが、この機能は保持されています。

  • FXMLLoaderクラスへの便利なコンストラクタ(RT-16815)

    いくつかの新しい便利なコンストラクタがFXMLLoaderクラスに追加されました。これらのコンストラクタでは、JavaFX 2.0で定義されたstatic load()メソッドがミラー化されますが、コール元コードからドキュメントのコントローラへのアクセスが簡単になります。

  • カスタマイズ可能なコントローラのインスタンス化(RT-16724RT-17268)

    JavaFX 2.0では、コントローラの作成はコール元コードによって制御されませんでした。これにより、アプリケーションでコントローラの初期化を管理する際に、Google GuiceやSpring Frameworkなどの依存関係インジェクション・システムを使用できませんでした。JavaFX 2.1では、コントローラ作成の委任を簡単にするCallbackインタフェースが追加されました。

    public interface Callback {
        public Object getController(Class<?> type);
    }
    

    FXMLLoaderオブジェクトにコントローラ・ファクトリが提供されると、ローダーによってコントローラの作成がファクトリに委任されます。実装によっては、特定タイプのコントローラが作成されない、または作成できないことを示すnull値が返される場合があります。この場合は、ローダーでデフォルトのコントローラ作成メカニズムが採用されます。また、実装によっては、コントローラのインスタンスを複数のFXMLドキュメントで共有できるように、コントローラがリサイクルされる場合もあります。ただし、開発者は、これを実行したときの影響、主に、このような場合にコントローラのフィールド・インジェクションを使用できないことを把握している必要があります(使用すると、コントローラのフィールドに最近ロードされたドキュメントからの値しか含まれなくなるため)。

  • 簡単に使用できるスタイルシート(RT-18299RT-15524)

    JavaFX 2.0では、FXMLでスタイルシートを適用することがあまり便利ではありませんでした。JavaFX 2.1では、大幅に簡単になりました。次のように、スタイルシートはルート<Scene>要素の属性として指定できます。

    <Scene stylesheets="/com/foo/stylesheet1.css, /com/foo/stylesheet2.css">
    </Scene>
    

    次のように、個別のノード上のスタイル・クラスを適用できるようになりました。

    <Label styleClass="heading, firstPage" text="First Page Heading"/>
    
  • イベント・ハンドラとしてコール元で指定された引数なしのコントローラ・メソッド(RT-18229)

    JavaFX 2.0では、コントローラベースのイベント・ハンドラがイベント・ハンドラで定義されたメソッド・シグネチャに従う必要があります。Eventクラスを拡張する型の単一引数を受け入れ、voidを返す必要があります。JavaFX 2.1では、引数の制限が解除されたため、引数を取らないコントローラのイベント・ハンドラを作成できるようになりました。

  • <fx:constant>タグ

    クラス定数のルックアップを簡単にする<fx:constant>タグがFXMLに追加されました。たとえば、次のように、java.lang.Doubleクラスで定義されたNEGATIVE_INFINITY定数を参照できるようになりました。

    <Double fx:constant="NEGATIVE_INFINITY"/>
    
  • FXMLでのサブコントローラへのアクセスの改善

    JavaFX 2.1以前では、ルート・コントローラ・クラスからサブコントローラにアクセスすることが簡単ではありませんでした。このため、たとえば、コントローラを使用して、include文で定義された内容を含むダイアログ・ウィンドウを開くことや移入することが困難でした。

    JavaFX 2.2では、ネストされたコントローラのインスタンスが、それを含むドキュメントのコントローラ内のメンバー・フィールドに直接マップされるため、ネストされたコントローラとの対話が大幅に簡単になっています。次のFXMLドキュメントおよびコントローラを考えてみます。

    <VBox fx:controller="com.foo.MainController"> 
    ...
        <fx:include fx:id="dialog" source="dialog.fxml"/>
    ...
    </VBox>
    
    public class MainController extends Controller { 
        @FXML private Window dialog;
        @FXML private DialogController dialogController;
    
        ...
    }
    

    コントローラのinitialize()メソッドがコールされると、ダイアログ・フィールドにdialog.fxmlファイルからロードされたルート要素が含まれ、dialogControllerオブジェクトにinclude文のコントローラが含まれます。その後、たとえば、ダイアログを移入および表示するために、メイン・コントローラはinclude文のコントローラ上でメソッドを呼び出すことができます。

  • リフレクションを使用したコントローラの初期化のサポート

    JavaFX 2.1以前では、関連付けられたFXMLドキュメントの内容が完全にロードされたときに通知されるようにInitializableインタフェースを実装するには、コントローラ・クラスが必要でした。JavaFX 2.2では、これが必要なくなりました。FXMLLoaderクラスのインスタンスは、単に、コントローラ上でinitialize()メソッドを検索し、使用可能な場合にそれをコールするだけです。イベント・ハンドラなどのその他のFXMLコールバック・メソッドと同様に、publicでなければ、このメソッドに@FXML注釈を付ける必要があります。

    開発者は新規開発で、このアプローチを使用することをお薦めします。Initializableインタフェースは非推奨になっていませんが、今後のリリースではその可能性があります。

  • FXMLベースのカスタム・コントロールの作成の簡略化

    以前のリリースでは、FXMLで定義された内部構造を持つカスタム・コントロールの作成は非常に困難なものでした。JavaFX 2.2には、このプロセスを大幅に簡略化する、目立たないが強力な拡張機能が備わっています。新しいsetRoot()およびsetController()メソッドを使用すると、これらのオブジェクトの作成をFXMLLoaderに委任するのではなく、コール元コードでドキュメント・ルートおよびコントローラの値をそれぞれのドキュメント名前空間に注入できます。これにより、開発者はマークアップを使用して内部で実装されているが、(APIの観点からは)プログラムで実装されたコントロールと同一に見える再利用可能なコントロールを作成できます。

    たとえば、次のコード・マークアップは、TextFieldおよびButtonインスタンスを含む単純なカスタム・コントロールの構造を定義します。ルート・コンテナは、javafx.scene.layout.VBoxクラスのインスタンスとして定義されます。

    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    
    <fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml">
        <TextField fx:id="textField"/>
        <Button text="Click Me" onAction="#doSomething"/>
    </fx:root>
    

    JavaFX 2.2で追加された<fx:root>タグを指定すると、FXMLLoaderクラスのgetRoot()メソッドをコールすることで要素の値が取得されます。load()メソッドをコールする前に、コール元コードでsetRoot()メソッドをコールして、この値を指定する必要があります。コール元コードでsetController()メソッドをコールすると、ドキュメントのコントローラに値を指定することもできます。

    詳細は、「FXMLを使用したカスタム・コントロールの作成」を参照してください。

FXMLローダーと以前のJavaFXリリースとの非互換性

次の項では、ユーザーがJavaFX 2.1 FXMLローダーを使用してJavaFX 2.0 FXMLファイルをロードした場合に発生する可能性のある互換性の問題について説明します。

JavaFX 2.1で非推奨になった一部のJavaFX 2.0 FXMLエスケープ・シーケンス

表2-1に、JavaFX 2.0のFXMLでは使用されていたが、JavaFX 2.1では非推奨になった二重文字のエスケープ・シーケンスを示します。かわりに、エスケープ文字としてバックスラッシュを使用します。

表2-1 非推奨および現在のエスケープ・シーケンス

JavaFX 2.0のエスケープ・シーケンス JavaFX 2.1のエスケープ・シーケンス

$$

\$

%%

\%

@@

\@


このような非推奨のエスケープ・シーケンスのいずれかが使用されていると、Scene Builderによりコンソールに警告が表示されますが、それでもFXMLはロードされます。次回ファイルが保存されるときに、Scene Builderによって、非推奨のエスケープ文字が新しい構文に自動的に置き換えられます。

エスケープ文字になったバックスラッシュ

JavaFX 2.1では、バックスラッシュ\がFXMLのエスケープ文字です。その結果、JavaFX 2.0アプリケーションのFXMLファイルにバックスラッシュで始まるFXML文字列属性が含まれていると、FXMLのロードが回避されたり、FXMLローダーで文字列が誤って解釈される可能性があります。

解決策: JavaFX 2.0アプリケーションのすべてのFXMLバックスラッシュ・テキストについて、追加のバックスラッシュを追加して文字をエスケープします。

例:

コードの次の行を削除します。

<Button text="\"/>

これをコードの次の行で置換します。

<Button text="\\"/>

ウィンドウを閉じる

目次

JavaFX: FXMLの習得

展開 | 縮小