メモの日々


2014年01月04日(土) [長年日記]

[java] JavaFXでFXMLを読み込む

JavaFXを使ってみる。公式ドキュメントは

かな。日本語の情報はJavaFX 2で始めるGUI開発の連載くらいしか見当たらないのでこれを順番に読んでみる。この連載は目次が見当たらず不便。連載の第1回ではFXMLを読み込む例が説明されているのでそれを試してみる。

メインクラス

JavaFXにはjavafx.application.Applicationクラスが用意されている。ひとまずはこれのサブクラスでmain()を実装すればよさそう。

package hello;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Hello extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
	Parent root = FXMLLoader.load(getClass().getResource("Hello.fxml"));
	primaryStage.setScene(new Scene(root));
	primaryStage.show();
    }

    public static void main(String[] args) {
	launch(args);
    }
}
  • main()ではApplication.launch()を呼び出す。
  • そうするとApplication#start()が呼ばれるようなので、ここでメインウィンドウを作成する。
  • StageがSwingのJFrameみたいなものなのかな。
  • StageにはSceneを設定している。
  • SceneにはParentを設定している。
  • ParentはFXMLLoader.load()を使ってFXMLから作れるみたい。

FXML

メインクラスでロードしているFXMLは次のような感じ。

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="300">
  <children>
    <Label text="ハロー" />
  </children>
</AnchorPane>
  • ルート要素をAnchorPaneにしている。このクラスがParentのサブクラスだからFXMLLoader.load()の戻り値をParent型の変数に代入できるみたい。
  • AnchorPaneの大きさを指定していて、それがウィンドウの大きさに影響する。
  • FXMLの要素にはimportしたクラス名を指定できる。

実行結果

Helloを実行すると次のようなウィンドウが表示された。

表示されたウィンドウ