Java8からSwingに次ぐ新しいGUIライブラリとしてJavaFXが標準で使えるようになった。 今日はJavaFXを使い始めるにあたって参考になる最小のサンプルを書いてみる。
ウィンドウの表示
まずはウィンドウを表示しなければはじまらない。
JavaFXのアプリケーションはApplication
を継承して作成する。 Application
はlaunch()
で起動させる。 launch()
するとstart()
が呼ばれるのでここに初期化の処理を書く。
JavaFXではシーングラフを表すScene
で描画対象を指定する。 最小のシーングラフは適当なルートノードのみを含むグラフである。 この例では空のVBox
をルートノードとすることにする。
あとはstart()
に渡されるStage
にsetScene()
でシーングラフを設定して、Stage
のshow()
を呼べばウィンドウが表示される。
Sample1.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Sample1 extends Application {
public void start(Stage stage) throws Exception {
VBox root = new VBox();
stage.setScene(new Scene(root, 640, 480));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ラベルの追加
続いてVBox
にラベルを追加してみることにする。
VBox
などレイアウトへの要素の追加は、getChildren()
で得られるObservableList
にadd()
することで行う。 JavaFXのラベルコントロールはLabel
である。 コンストラクタに文字列を与えるとその文字列を表示するラベルとなる。便利だ。
以下はHello, JavaFX!
という文字列を表示する例である。
Sample2.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Sample2 extends Application {
public void start(Stage stage) throws Exception {
VBox root = new VBox();
root.getChildren().add(new Label("Hello, JavaFX!"));
stage.setScene(new Scene(root, 640, 480));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
FXMLの読み込み
JavaFXではFXMLという言語でインタフェースを記述できることが特徴となっている。 次の例ではsample2.javaと同じウィンドウをFXMLを使って表示させてみよう。
FXMLの実体はXMLである。 まずimport
でインポートするコントロールを記述し、シーングラフの構造はタグで記述する。 以下に示すSample3.fxmlは、sample2.javaでプログラムで記述したシーングラフを、FXMLで書き起こしたものである。
FXMLのロードにはFXMLLoader
を利用する。 load()
は引数にURLを取るので、JavaのリソースのURLをgetResource()
で取得している。 EclipseであればJavaファイルと同一のフォルダにFXMLファイルを配置してやれば読み込めるはずである。
Sample3.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox>
<children>
<Label text="Hello, JavaFX!"/>
</children>
</VBox>
Sample3.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Sample3 extends Application {
public void start(Stage stage) throws Exception {
VBox root = (VBox) FXMLLoader.load(getClass().getResource("Sample3.fxml"));
stage.setScene(new Scene(root, 640, 480));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}