FXMLは、JavaFX2で各シーンのレイアウトをXMLで記述するもの。
|
JavaFXのシーンのクラスを使ってプログラム内でシーングラフを構築するのではなく、
シーングラフ自体をXMLファイル(FXML)に記述して、実行時にそのXMLファイルを読み込む。
XMLファイルにはレイアウト情報だけ記述し、動作(処理)はFXMLとは別に普通にプログラムする。
FXMLで記述されたものを「FXMLドキュメント」と呼ぶ。
FXMLはXMLファイルだが、DTDは無い。
XMLのタグ(要素名)をシーンのクラス名にしてしまう為、(独自クラスまで含めると)全てを定義するのは不可能だから。
FXMLを使って、ウィンドウを開いて文字列を表示する例。
(→Javaプログラムだけで文字列を表示する例)
<?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>
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>」の様に、ボディー部にプロパティーを書くことも出来る。
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);