ドキュメント



JavaFX: JavaFXスタート・ガイド

6 FXMLを使用したユーザー・インタフェースの作成

このチュートリアルでは、コードのアプリケーション・ロジックから切り離してユーザー・インタフェースをビルドするための構造を提供するXMLベースの言語である、JavaFX FXMLを使用する利点について説明します。

このドキュメントを最初から開始した場合は、JavaFXのみを使用してログイン・アプリケーションを作成する方法については確認しています。ここでは、FXMLを使用して同じログイン・ユーザー・インタフェースを作成し、アプリケーション設計をアプリケーション・ロジックから切り離すことで、コードをメンテナンスしやすくします。図6-1に、このチュートリアルでビルドするログイン・ユーザー・インタフェースを示します。

図6-1 ログイン・ユーザー・インタフェース

図6-1の説明が続きます
「図6-1 ログイン・ユーザー・インタフェース」の説明

このチュートリアルでは、NetBeans IDEを使用します。使用しているNetBeans IDEのバージョンでJavaFX 8がサポートされていることを確認します。詳細は、「Java SE Downloads」ページの「Certified System Configurations」セクションを参照してください。

プロジェクトの設定

最初のタスクは、NetBeans IDEでJavaFX FXMLプロジェクトを設定することです。

  1. 「ファイル」メニューから、「新規プロジェクト」を選択します。

  2. 「JavaFX」アプリケーション・カテゴリで、「JavaFX FXMLアプリケーション」を選択します。「次」をクリックします。

  3. プロジェクトにFXMLExampleという名前を付け、「終了」をクリックします。

    NetBeans IDEで、基礎となるHello Worldアプリケーションのコードが含まれたFXMLプロジェクトが開きます。アプリケーションには3つのファイルが含まれています。

    • FXMLExample.java。このファイルによって、FXMLアプリケーションに必要な標準のJavaコードが管理されます。

    • FXMLDocument.fxml。これは、ユーザー・インタフェースを定義するFXMLソース・ファイルです。

    • FXMLDocumentController.java。これは、マウスおよびキーボード入力を処理するためのコントローラ・ファイルです。

  4. このアプリケーションに意味のある名前になるように、名前をFXMLDocumentController.javaからFXMLExampleController.javaに変更します。

    1. 「プロジェクト」ウィンドウで、FXMLDocumentController.javaを右クリックして、「リファクタリング」「名前の変更」を選択します。

    2. FXMLExampleControllerと入力し、「リファクタリング」をクリックします。

  5. FXMLDocument.fxmlからfxml_example.fxmlに名前を変更します。

    1. 「FXMLDocument.fxml」を右クリックして、「名前の変更」を選択します。

    2. fxml_exampleと入力し、「OK」をクリックします。

FXMLソース・ファイルのロード

最初に編集するファイルは、FXMLExample.javaファイルです。このファイルには、アプリケーションのメイン・クラスを設定し、ステージおよびシーンを定義するためのコードが含まれています。FXMLについてより詳細に言うと、このファイルでは、FXMLソース・ファイルをロードして結果のオブジェクト・グラフを返すFXMLLoaderクラスが使用されます。

例6-1に太字で示すように変更します。

例6-1 FXMLExample.java

@Override
    public void start(Stage stage) throws Exception {
       Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));
    
        Scene scene = new Scene(root, 300, 275);
    
        stage.setTitle("FXML Welcome");
        stage.setScene(scene);
        stage.show();
    }

適切な手法は、作成時にシーンの高さと幅を設定することであり(この場合は300 x 275)、そうしないと、シーンはデフォルトで、その内容を表示するために必要な最小サイズになります。

import文の変更

次に、fxml_example.fxmlファイルを編集します。このファイルによって、アプリケーションの開始時に表示されるユーザー・インタフェースが指定されます。最初のタスクは、コードが例6-2に示すようになるように、import文を変更することです。

例6-2 XML宣言とimport文

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

<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

Javaの場合と同様に、クラス名は(パッケージ名を含めて)完全修飾するか、例6-2に示すようにimport文を使用してインポートできます。必要に応じて、クラスを参照する特定のimport文を使用できます。

GridPaneレイアウトの作成

NetBeansによって生成されるHello Worldアプリケーションでは、AnchorPaneレイアウトが使用されます。ログイン・フォームではGridPaneレイアウトを使用しますが、これは、コントロールをレイアウトする、行および列の柔軟なグリッドを作成できるためです。

AnchorPaneレイアウトとその子を削除し、例6-3GridPaneレイアウトに置き換えます。

例6-3 GridPaneレイアウト

<GridPane fx:controller="fxmlexample.FXMLExampleController" 
    xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<padding><Insets top="25" right="25" bottom="10" left="25"/></padding>

</GridPane>

このアプリケーションでは、GridPaneレイアウトはFXMLドキュメントのルート要素であり、ルート要素として2つの属性を持ちます。fx:controller属性は、マークアップでコントローラベースのイベント・ハンドラを指定する場合に必要です。xmlns:fx属性は常に必要であり、fx名前空間を指定します。

コードの残りの部分では、グリッド・ペインの位置合せと間隔が定義されます。alignmentプロパティによって、グリッドのデフォルトの位置は、シーンの左上から中央に変更されます。gapプロパティによって行と列の間隔が管理され、paddingプロパティによってグリッド・ペインのエッジの周りの領域が管理されます。

ウィンドウがサイズ変更されると、グリッド・ペイン内のノードはレイアウト制約に従ってサイズ変更されます。この例では、ウィンドウを拡大または縮小したときに、グリッドは中央のままです。paddingプロパティによって、ウィンドウを小さくしたときにグリッドの周りにパディングができます。

テキストおよびパスワード・フィールドの追加

図6-1を見返すと、ログイン・フォームには、タイトルのWelcomeと、ユーザーから情報を収集するテキストおよびパスワード・フィールドが必要なことがわかります。例6-4のコードは、GridPaneレイアウトの一部であり、</GridPane>文の上に配置する必要があります。

例6-4 Text、Label、TextFieldおよびPasswordFieldコントロール

<Text text="Welcome" 
        GridPane.columnIndex="0" GridPane.rowIndex="0"
        GridPane.columnSpan="2"/>
 
    <Label text="User Name:"
        GridPane.columnIndex="0" GridPane.rowIndex="1"/>
 
    <TextField 
        GridPane.columnIndex="1" GridPane.rowIndex="1"/>
 
    <Label text="Password:"
        GridPane.columnIndex="0" GridPane.rowIndex="2"/>
 
    <PasswordField fx:id="passwordField" 
        GridPane.columnIndex="1" GridPane.rowIndex="2"/>

最初の行では、Textオブジェクトが作成され、そのテキスト値がWelcomeに設定されます。GridPane.columnIndexおよびGridPane.rowIndex属性は、グリッド内でのTextコントロールの配置に対応します。グリッド内の行および列の番号付けはゼロから始まり、Textコントロールの位置は、最初の行の最初の列内を意味する(0,0)に設定されます。GridPane.columnSpan属性は2に設定され、Welcomeタイトルはグリッド内の2つの列にわたります。この余分の幅は、このチュートリアルで、後でスタイルシートを追加してテキストのフォント・サイズを32ポイントに増やしたときに必要になります。

次の行では、テキストがUser NameであるLabelオブジェクトが列0、行1に作成され、TextFieldオブジェクトがその右の列1、行1に作成されます。同様に、別のLabelおよびPasswordFieldオブジェクトが作成されてグリッドに追加されます。

グリッド・レイアウトで作業するときに、デバッグに有効なグリッド線を表示できます。この場合は、文<gridLinesVisible>true</gridLinesVisible><padding></padding>文の直後に追加して、gridLinesVisibleプロパティをtrueに設定します。そうすると、アプリケーションを実行したときに、図6-2に示すように、グリッドの列および行とgapプロパティに対して線が表示されます。

図6-2 グリッド線が表示されたログイン・フォーム

図6-2の説明が続きます
「図6-2 グリッド線が表示されたログイン・フォーム」の説明

ボタンおよびテキストの追加

アプリケーションに必要な最後の2つのコントロールは、データを送信するためのButtonコントロールと、ユーザーがボタンを押したときにメッセージを表示するためのTextコントロールです。例6-5に、コードを示します。このコードを</GridPane>の前に追加します。

例6-5 HBox、ButtonおよびText

<HBox spacing="10" alignment="bottom_right" 
        GridPane.columnIndex="1" GridPane.rowIndex="4">
        <Button text="Sign In"     
        onAction="#handleSubmitButtonAction"/>
</HBox>

<Text fx:id="actiontarget"
       GridPane.columnIndex="0" GridPane.columnSpan="2"
 GridPane.halignment="RIGHT" GridPane.rowIndex="6"/>

HBoxペインは、GridPaneレイアウト内の他のコントロールに適用されるデフォルトの位置合せとは異なるボタンの位置合せを設定するために必要です。alignmentプロパティはbottom_rightに設定され、これによってノードは縦の領域の一番下、横の領域の右端に配置されます。HBoxペインはグリッドの列1、行4に追加されます。

HBoxペインにはButtonという子が1つあり、そのtextプロパティはSign inに、onActionプロパティはhandleSubmitButtonAction()に設定されます。FXMLはアプリケーションのユーザー・インタフェースの構造を定義する便利な方法ですが、アプリケーションの動作を実装する方法は用意されていません。このチュートリアルの次の項「イベントを処理するコードの追加」で、handleSubmitButtonAction()メソッドの動作をJavaコードで実装します。

Textコントロールのコードで示したようにfx:id値を要素に割り当てると、コード内の他の場所から参照できる変数がドキュメントの名前空間に作成されます。必須ではありませんが、コントローラ・フィールドを定義するとコントローラおよびマークアップがどのように関連しているかが明確になります。

イベントを処理するコードの追加

次に、ユーザーがボタンを押したときにTextコントロールによってメッセージが表示されるようにします。これは、FXMLExampleController.javaファイルで行います。NetBeans IDEによって生成されたコードを削除し、例6-6のコードに置き換えます。

例6-6 FXMLExampleController.java

package fxmlexample;
 
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.text.Text;
 
public class FXMLExampleController {
    @FXML private Text actiontarget;
    
    @FXML protected void handleSubmitButtonAction(ActionEvent event) {
        actiontarget.setText("Sign in button pressed");
    }

}

@FXMLアノテーションは、FXMLマークアップによる使用のために、public以外のコントローラ・メンバー・フィールドおよびハンドラ・メソッドをタグ付けするために使用されます。handleSubmtButtonActionメソッドによって、ユーザーがボタンを押したときにactiontarget変数がSign in button pressedに設定されます。

これで、アプリケーションを実行して、完成したユーザー・インタフェースを表示できます。図6-3に、2つのフィールドにテキストを入力して「Sign in」ボタンをクリックしたときの結果を示します。問題が発生した場合は、自分のコードをFXMLLoginの例と比較できます。

図6-3 FXMLのログイン・ウィンドウ

図6-3の説明が続きます
「図6-3 FXMLのログイン・ウィンドウ」の説明

スクリプト言語を使用したイベントの処理

Javaコードを使用してイベント・ハンドラを作成するかわりに、JSR 223と互換性のあるスクリプト・エンジンを備えた任意の言語を使用してハンドラを作成できます。そのような言語には、JavaScript、Groovy、Jython、Clojureなどがあります。

オプションで、ここではJavaScriptの使用を試すことができます。

  1. ファイルfxml_example.fxmlで、JavaScript宣言をXML doctype宣言の後に追加します。

    <?language javascript?>

  2. Buttonマークアップで、コールが次のようになるように関数の名前を変更します。

    onAction="handleSubmitButtonAction(event);"

  3. fx:controller属性をGridPaneマークアップから削除し、例6-7に示すように、そのすぐ下に<script>タグでJavaScript関数を追加します。

    例6-7 FXML内のJavaScript

    <GridPane xmlns:fx="http://javafx.com/fxml" 
                  alignment="center" hgap="10" vgap="10">
             <fx:script>
                 function handleSubmitButtonAction() {
                     actiontarget.setText("Calling the JavaScript");
                 }
             </fx:script>
    

    または、JavaScript関数を外部ファイル(fxml_example.jsなど)に置き、次のようにスクリプトを含めることができます。

    <fx:script source="fxml_example.js"/>

結果を図6-4に示します。

図6-4 JavaScriptを使用したログイン・アプリケーション

図6-4の説明が続きます
「図6-4 JavaScriptを使用したログイン・アプリケーション」の説明

FXMLでスクリプト言語を使用することを検討している場合、デバッグ時にスクリプト・コードのステップ実行がIDEでサポートされない場合があることに注意してください。

CSSによるアプリケーションのスタイル設定

最後のタスクは、カスケード・スタイルシート(CSS)を追加することによって、人を引き付けるログイン・アプリケーションにすることです。

  1. スタイルシートを作成します。

    1. 「プロジェクト」ウィンドウで、「ソース・パッケージ」の下のfxmlexampleフォルダを右クリックし、「新規」「その他」を選択します。

    2. 「新規ファイル」ダイアログ・ボックスで、「その他」「Cascading Style Sheet」を選択し、「次」をクリックします。

    3. Loginと入力し、「終了」をクリックします。

    4. Login.cssファイルの内容を自分のCSSファイルにコピーします。Login.cssファイルは、ダウンロード可能なLoginCSS.zipファイルに含まれています。CSSファイル内のクラスの詳細は、「JavaFX CSSによる装飾的なフォーム」を参照してください。

  2. background.jpgファイルを右クリックしてfxmlexampleフォルダに保存することによって、背景用の灰色のリネンのようなイメージをダウンロードします。

  3. fxml_example.fxmlファイルを開き、例6-8に示すように、GridPaneレイアウトのマークアップの最後の前にスタイルシート要素を追加します。

    例6-8 スタイルシート

    <stylesheets>
        <URL value="@Login.css" />
      </stylesheets>
    
    </GridPane>
    

    URL内のスタイルシート名の前の@記号は、スタイルシートがFXMLファイルと同じディレクトリ内にあることを示します。

  4. グリッド・ペインに対してルート・スタイルを使用するには、例6-9に示すように、GridPaneレイアウトのマークアップにスタイル・クラスを追加します。

    例6-9 GridPaneのスタイル設定

    <GridPane fx:controller="fxmlexample.FXMLExampleController" 
        xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" 
        styleClass="root">
    
  5. 例6-10に示すように、CSSファイルで定義されたスタイル#welcome-textが使用されるように、Welcome Textオブジェクトに対してwelcome-text IDを作成します。

    例6-10 テキストID

    <Text id="welcome-text" text="Welcome" 
            GridPane.columnIndex="0" GridPane.rowIndex="0" 
            GridPane.columnSpan="2"/>
    
  6. アプリケーションを実行します。図6-5に、スタイル設定されたアプリケーションを示します。問題が発生した場合は、ダウンロード可能なFXMLExample.zipファイルに含まれているコードを確認してください。

    図6-5 スタイル設定されたログイン・アプリケーション

    図6-5の説明が続きます
    「図6-5 スタイル設定されたログイン・アプリケーション」の説明

次に実行すること

FXMLについて理解したので、FXML言語を構成する要素の詳細が記載された「FXMLの概要」を参照します。このドキュメントは、APIドキュメントjavafx.fxmlパッケージに含まれています。

Scene Builderでfxml_example.fxmlファイルを開いて変更を加えることで、JavaFX Scene Builderツールを試すこともできます。このツールでは、JavaFXアプリケーションのUIを設計するためのビジュアルなレイアウト環境が提供され、レイアウトのFXMLコードが自動的に生成されます。FXMLファイルは保存時に再フォーマットされる場合があることに注意してください。このツールの詳細は、JavaFX Scene Builderの概要を参照してください。JavaFX Scene Builderユーザーズ・ガイドのCSSでのスキニングとCSS Analyzerに関する項にも、FXMLレイアウトをスキニングする方法に関する情報があります。

ウィンドウを閉じる

目次

JavaFX: JavaFXスタート・ガイド

展開 | 縮小