読者です 読者をやめる 読者になる 読者になる

No Bugs, No Life

読んだ本や、プログラミング、システム開発等のねたを中心に。文章を書く練習なので少し硬派に書くつもりだけど、どうなることやら。

SceneBuilder(FXML)とJavaのバインド

DEV MW JavaFX

MementoWeaver開発記(2)
開発環境もできたので早速JavaFXをつかって画面周りを書き始めてみる。
今回の先達は、id:funakkyさんのSceneBuilderとEclipseでJavaFX2.1のサンプル作成 - funakkyの日記を参考とさせていただく。
(先達に感謝します。)

MWは現時点の想定で4画面程度の小規模アプリだが、大まかに方針を考えておく。
画面遷移はGitHubに載せた。

パッケージングの方針

  • Javaプロジェクト名:MementoWeaver
  • 基底のパッケージ:nobugs.nolife.mw
  • 画面周りのパッケージ:nobugs.nolife.mw.ui

作成画面(FXMLで作成する)

  • メインメニュー(MainMenu.fxml)
  • 素材のインストール(InstallMaterial.fxml)
  • メメントの生成(GenerateMemento.fxml)
  • メメントの修正(ModifyMemento.fxml)

メインクラスの開発

まずはもっともシンプルなメニュー画面から着手する。
アプリ起動のクラスはとりあえず、MainMenuとする。ここは先達の記事を参考にほぼ丸写しで済む。
なお、次のステップで画面遷移(シーン切り替え)を実装する際にクラス構造は見直す。*1

package nobugs.nolife.mw.ui;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;


public class MainMenu extends Application {

	@Override
	public void start(Stage stage) throws Exception {
		// 画面のタイトルを設定
		stage.setTitle("Memento Weaver メインメニュー");
		// FXMLファイルをロード
		Parent root = FXMLLoader.load(getClass().getResource("MainMenu.fxml"));
		// 表示内容を設定
		Scene scene = new Scene(root);
		stage.setScene(scene);

		// 画面表示
		stage.show();
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

コントロールクラス

コントロールクラスは、FXMLファイル(画面定義)とJavaの世界を繋ぐクラスとなるので、画面名称+Controllerの命名とする。
なお、メインメニューに配置するコントロールはButtonのみなので、インスタンス変数は持たずにイベントハンドラのみを定義する。
イベントハンドラの名称は後ほどSceneBuilderから指定されることになる。
また、このクラスは所謂ところのPOJO*2で、FXML周りのインスタンス変数やメソッドには@FXMLアノテーションを付ける。

package nobugs.nolife.mw.ui;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class MainMenuController {
	// 入力フィールドに対応するインスタンスを保持する変数
	// 対応付けはFXMLファイルで定義する
	// publicフィールドの場合は@FXMLの記述は不要

	// イベントハンドラ
	@FXML	protected void install(ActionEvent e) {
		System.out.println(e);
	}
	@FXML	protected void generate(ActionEvent e) {} // TODO not implemented yet
	@FXML	protected void modify(ActionEvent e) {} // TODO not implemented yet
	@FXML	protected void exit(ActionEvent e) {} // TODO not implemented yet
}

FXMLファイル

ここからEclipseを離れてSceneBuilderの世界に。
GUIビルダとして良く出来ていると思うし、使い方についても特に難しいところは無いので、特に注意すべき点も無いように思う。
ただ、先達のページの解説と一部違う箇所があったので、そこだけ追記する。
(このページでは、Java SE 7u13(JavaFX:2.5.5)を使っているのでその関係か?Scene Builderのバージョンは一緒のようなんだけどなぁ。)

FXMLファイルとコントローラクラスを関連付けるための"コントロール・クラス"は、先達のページではScreen Builder画面右ペインの[Document]にあるとの記載だったが、今のバージョンではAnchorPane(ルート要素?)を選択した際の[コード]セクションにある様子*3
f:id:kazyury:20130203003358p:plain

それ以外については特に注意すべき点も無いように思う。

画面遷移などについてはまた次回。

*1:MainMenuクラスがApplicationのサブクラスって何かおかしいが、細かいことはまだ気にしないこととする。

*2:アノテーションが付いているのにPOJOって言うのは「何か違うんじゃない?」と毎回感じている。みんな違和感ないのかなぁ。

*3:GIMPの使い方をすっかり忘れてしまったので線で囲うことも出来なかった... orz