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);