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を実行すると次のようなウィンドウが表示された。