S-JIS[2012-04-07] 変更履歴

FXMLメモ

FXMLは、JavaFX2で各シーンのレイアウトをXMLで記述するもの。


概要

JavaFXのシーンのクラスを使ってプログラム内でシーングラフを構築するのではなく、
シーングラフ自体をXMLファイル(FXML)に記述して、実行時にそのXMLファイルを読み込む。

XMLファイルにはレイアウト情報だけ記述し、動作(処理)はFXMLとは別に普通にプログラムする。

FXMLで記述されたものを「FXMLドキュメント」と呼ぶ。

FXMLはXMLファイルだが、DTDは無い。
XMLのタグ(要素名)をシーンのクラス名にしてしまう為、(独自クラスまで含めると)全てを定義するのは不可能だから。


ラベルを表示する例

FXMLを使って、ウィンドウを開いて文字列を表示する例。
(→Javaプログラムだけで文字列を表示する例

D:/javafx/sample/sample1.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<Pane prefWidth="256" prefHeight="212" xmlns:fx="http://javafx.com/fxml">
  <children>
    <Label text="Hello, World!" layoutX="16" layoutY="32" />
  </children>
</Pane>

src/example/Fxml1.java:

package example;
import java.io.File;
import java.net.URL;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Fxml1 extends Application {

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage stage) throws Exception {
		URL file = new File("D:/javafx/sample/sample1.fxml").toURI().toURL();
		Parent root = FXMLLoader.load(file);

		stage.setTitle("FXML Test");
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.show();
	}
}

FXMLLoaderクラスのstaticメソッドのload()を使って、FXMLファイルを読み込む。
それ以外は全てJavaで作ったプログラムと同じ。


Javaでシーングラフを構築するのとFXMLで記述するのは、けっこう似ている。

  FXML Java 備考
import
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
import javafx.scene.control.*;
import javafx.scene.layout.*;
FXMLのタグ(要素)に使うのはJavaのクラス名なので、それをインポートする。
root
<Pane prefWidth="256" prefHeight="212">
Pane root = new Pane();
root.setPrefWidth(256);
root.setPrefHeight(212);
 
ラベル
<Label text="Hello, World!" layoutX="16" layoutY="32" />
Label label = new Label();
label.setText("Hello, World!");
label.setLayoutX(16);
label.setLayoutY(32);
 
children
<Pane 〜>
  <children>
    <Label 〜/>
  </children>
</Pane>
root.getChildren().add(label);
親シーンのchildrenに子シーンを追加していく。

Javaでは、各シーンのセッターメソッドでプロパティーをセットしていく。
FXMLでは、タグの属性としてプロパティーをセットする。

つまり、Javaの「s.setName(value)」はFXMLの「<s name="value">」に相当する。
また、FXMLでは、「<s><name>value</name></s>」の様に、ボディー部にプロパティーを書くことも出来る。


UTF-8以外の読み込み

FXMLファイルはFXMLLoader.load()で読み込めるが、UTF-8として扱われる。(JavaFX2.0.2)
FXMLファイルのヘッダーでencoding="UTF-8"以外のものを宣言していても関係ない(苦笑)

UTF-8以外で読み込むには、キャラクターセットを指定する。

	URL file = new File("D:/javafx/sample/sample1.fxml").toURI().toURL();
	InputStream is = file.openStream();
	Parent root = (Parent) new FXMLLoader(Charset.forName("MS932")).load(is);

JavaFXへ戻る / Javaへ戻る / 技術メモへ戻る
メールの送信先:ひしだま