JavaFX2.1の基礎メモ 〜構成、開発環境、サンプル〜

ちゃっとGUIな便利ツールを作成したいと思ったときに役立てば、ということで、JavaFX2.1メモ。
なんだかんだ一番使い慣れた言語で作るのが一番速かったりなので。
(個人的には昔Swingで色々作っていて手馴れてたりするが、潮流的なものも勘案して、当面はJavaFXでいこうと思う)

JavaFX2.1基礎

構成ファイル
  • アプリケーションクラス
    • javafx.application.Application を継承して作成する
    • JavaFXのランタイムは、アプリケーションクラスを以下の通り実行する

1. コンストラクタ呼びだし
2. init() メソッド呼びだし (⇒ 初期化処理はここに記述)
3. start(javafx.stage.Stage) メソッド呼びだし (⇒ 主処理はここに記述)
4. 最後のウィンドウが閉じられるか、Platform.exit()が呼ばれるかまで待つ
5. stop() メソッド呼び出し (⇒ 後処理はここに記述)

    • launch メソッドを呼ぶ main メソッドを記述すればスタンドアロン実行可能である(?)
  • コントローラクラス
    • POJOで作成する
    • レイアウトファイルの各項目IDに紐付くフィールドを記述する。privateフィールドの場合は @FXML アノテーションを付与する
    • レイアウトファイルで記述したイベント処理に紐づくメソッドを protected void で記述する
  • レイアウトファイル(FXML)
    • レイアウト定義や、項目とイベント処理の紐付けを記述する

なお、参照先指定関係は、
  アプリケーションクラス ⇒ レイアウトファイル(FXML) ⇒ コントローラクラス
である。

オブジェクト構造

Stage
  Scene (:1つのFXMLファイルが相当?)
    Container
      Control

JavaFX SDKのインストール

下記公式サイトより。2012/05/19時点の安定最新バージョンは 2.1.0 。

JDKにバンドルされているようなので、「Java SE 7u4」をダウンロードした。

開発環境構築

NetBeans IDEという選択肢が有力っぽいが、
今回は Eclipse + SceneBuilder でやってみる。

  • Java(アプリケーション、コントローラ) ⇒ Eclipse(※jfxrt.jarにクラスパスを通すこと。「C:\Program Files\Oracle\JavaFX 2.1 SDK\rt\lib\jfxrt.jar」)
  • FXML ⇒ SceneBuilder
SceneBuilder

上記公式サイトから飛べる、下記URLからダウンロード。まだベータ版で、1.0 build b38。

で、作成したfxmlファイルは、 src/main/resources 以下に格納する。

実行可能jarの作成

Ecliple > プロジェクトを右クリック > エクスポート > Java > Runnable JAR file から。
「Library handling」では、「Copy required libraries into a sub-folder next to the generated JAR」を選べばいいだろう。

試作

アプリケーションクラス
package ok.javafx.test;

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

public class TestApplication extends Application {

	@Override
	public void start(Stage stage) throws Exception {
		// タイトル設定
		stage.setTitle("Test");

		// シーン設定
		Parent fxmlSchene = FXMLLoader.load(getClass().getResource("test.fxml"));
		Scene scene = new Scene(fxmlSchene, 300, 100);
		stage.setScene(scene);

		// 表示
		stage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
}
コントローラクラス
package ok.javafx.test;

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

public class TestController {
	@FXML
	private TextField txtName;

	@FXML
	private Label lblName;

	@FXML
	protected void writeText(ActionEvent e) {
		this.lblName.setText(this.txtName.getText());
	}
}
レイアウトファイル(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.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="ok.javafx.test.TestController">
  <children>
    <TextField fx:id="txtName" layoutX="14.0" layoutY="14.0" prefWidth="200.0" text=""/>
    <Label fx:id="lblName" layoutX="14.0" layoutY="41.0" text="初期値" />
    <Button fx:id="btnApply" layoutX="14.0" layoutY="63.0" onAction="#writeText" text="適用" />
  </children>
</AnchorPane>
動作

1. 初期表示

2. 入力

3. 適用ボタン押下

公式サイト