ドキュメント



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-3のGridPaneレむアりトに眮き換えたす。

䟋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スタヌト・ガむド

展開 | 瞮小