JavatterAdventCalendarの16日目の記事です。

今回はFXMLを使ってGUIの作成をします。
JavaFXではSwingのようにソースコードでレイアウトを作るだけでなく、FXMLと呼ばれるXMLのような言語でレイアウトを作成することが可能です。
今回はFXMLを使ってGUIを作成し、ボタンをクリックすることで新規ウィンドウでFXMLのGUIを表示してみます。

まずはFXMLを作成します。

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<BorderPane id="BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
  <center>
    <Label text="WindowTest" />
  </center>
</BorderPane>

BorderPaneのCenterにLabelを配置しているだけです。
直接手書きをしてもいいですが、SceneBuilderを使うことにより簡単に作成することが可能です。
SceneBuilder

SceneBuilderはこちらからDLできます。

次にこれを読み込みます。
JavatterFxmlLoader#load(Class,String)を使って読み込むことが出来ます。
第一引数にはFXMLと同じパッケージに属しているClassを渡し、第二引数にはFXMLのファイル名を渡します。

あとはWindowを開いてloadで戻ってきたParentを設定して完成です。

try {
	Parent p=JavatterFxmlLoader.load(getClass(), "TestWindow.fxml");//ロード
	Scene scene=new Scene(p);//シーンを作成
	Stage stage=new Stage();//新しいステージ(Window)を作成する
	stage.setScene(scene);//ステージにシーンを設定」
	stage.centerOnScreen();//ステージを画面中央へ
	stage.setTitle("TestWindow");//タイトルを設定
	stage.show();//表示
} catch (IOException e) {
	e.printStackTrace();
}

これで読み込み完了です。あとはボタンをクリックした時この処理をするようにしましょう。

@EventHandler
	public void onCreateTweetobject(final EventInitializeTweetobject event){
		MenuItem item=new MenuItem("Window");
		event.getController().addMenuItem(item);
		item.setOnAction(new javafx.event.EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				try {
					Parent p=JavatterFxmlLoader.load(getClass(), "TestWindow.fxml");//ロード
					Scene scene=new Scene(p);//シーンを作成
					Stage stage=new Stage();//新しいステージ(Window)を作成する
					stage.setScene(scene);//ステージにシーンを設定」
					stage.centerOnScreen();//ステージを画面中央へ
					stage.setTitle("TestWindow");//タイトルを設定
					stage.show();//表示
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}

次回はGUIを操作するコントローラーの解説をする予定です。お疲れ様でした。