こねこ Co., Ltd.

ぷろぐらむな話とゲームな話を少々。

FXMLを使わない、最も簡単なJavaFX入門

こんにちは。特にやることもないのでひたすらブログの更新をしてます。

JavaFXがもっと浸透してほしい

Javaを使ったことをある人でもJavaFXを使ったことある方はまだあまり居ないのではないでしょうか。

JavaFXはAWT、Swingに続く第三のGUIライブラリです。Javaなので環境に依存せず、WindowsでもLinuxでも同じように動作してくれます。

JavaFXの一つの特徴としてはFXMLというXMLファイルを使って画面を定義することができるため、コード本体と画面のレイアウトを分離できるというメリットがあります。またFXMLに対してCSSを適応することできるため、Webデザインの経験がある人なら比較的簡単にデザインをいじることができます。

またメディア関係の操作も充実しています。MediaPlayerクラスを使うことによってmp3のような音声ファイルだけでなく、flvやmpeg-4といった動画も再生することができます。

Hello, JavaFX!

割と最近は日本語圏の情報が増えてきたのでやりやすくなりましたが、FXMLをいきなり触ったりするものも多いので、今回はそれらの機能は使用せずに最もシンプルな形でJavaFXで文字を表示するプログラムを作ってみます。

とりあえず書いてみて動かしてみます。

実行するとこんな感じでウィンドウが表示されるはずです。

f:id:konekoltd:20171216151210p:plain

JavaFXの基本的な動きを理解する

実際に動かしてみたら、少しずつ中身の方を見ていきます。

JavaFXの起動

public class Main extends Application {

    public static void main(String[] args) {
        Application.launch(args);
    }

JavaFXではプログラムの起点となるクラスでApplicationクラスを継承させます。mainメソッドではlaunchメソッドを呼び出すことで、以下のstartメソッドが呼び出されJavaFXが起動します。

画面の構成

public void start(Stage stage) {
        VBox layout = new VBox();
        Label label = new Label("Hello JavaFX!");
        layout.getChildren().addAll(label);

        Scene scene = new Scene(layout);
        stage.setScene(scene);
        stage.show();
    }

}

さてはて、StageやらSceneやら謎の概念が出てきてしまいました。 でも実はそんなに複雑ではないので、順番に理解していきましょう。

StageとScene

f:id:konekoltd:20171216153923p:plain

StageクラスJavaFXのアプリケーションのすべての大本になるクラスです。要はウィンドウそのものの定義です。ここに以下に説明するSceneクラス(場面)をセットすることでJavaFXで画面が表示できます。

Stageクラスの主なメソッドは以下のようなものがあります。

// ウィンドウのタイトルを設定する
stage.setTitle(String value);

// 最小・最大ウィンドウサイズを指定する
stage.setMinWidth(double value);
stage.setMaxWidth(double value);
stage.setMinHeight(double value);
stage.setMaxHeight(double value);

// 使用するSceneを設定する
stage.setScene(Scene scene);

// ウィンドウを表示する
stage.show();

SceneクラスはStageにセットする、いわば"場面"といったようなものです。アプリケーションを作るときに、「メインメニューのScene」「設定のScene」といったものをそれぞれ用意しておき付け替えることによって場面の変更をすることも可能です。

Sceneクラスはインスタンス化する際にParentクラスを引数に取ります。Parentクラスは「VBox(垂直に並べる)」「HBox(水平に並べる)」のようなレイアウトに関するクラス、「Text」「Button」のような実際に表示するものに関するクラスなど、すべての要素(Node)のベースとなるクラスです。

Node

それでは内部の要素を定義している部分を見てみましょう。

        VBox layout = new VBox();
        Label label = new Label("Hello JavaFX!");
        layout.getChildren().addAll(label);

JavaFXでSceneの中に表示する要素はNode(ノード)と呼ばれます。これらはレイアウト・表示物にかかわらず全て前述のParentクラスを継承しており、それぞれを親子関係とすることができます。Sceneクラスをインスタンス化した際に渡したNodeが最上位の親となり、そこから親子構造を成していく、といった形になります。

具体的にコードの中身を見ていきます。

VBoxクラスはレイアウトを定義するクラスです。子要素としてとったNodeを追加した順に垂直(縦方向)に上から下に並べていきます。

Labelクラスは文字を表示するクラスです。引数として渡した文字列を表示します。

getChildren().addやaddAllメソッドを使うことによって親子関係を定義することができます。

まとめ

JavaFXはStage・Sceneを基本として、その中に親子関係を定義したNodeを突っ込むといった形がJavaFXのスタイルです。最初にFXMLの話をしましたが、FXMLは実際のところNodeの親子関係をXMLファイルとしてわかりやすくしたものです。

JavaGUIをやってみたい!と興味がある方が友人にも何人かいるのですが、だいたいは最初のチュートリアルのFXMLでよーわからんと諦めてしまう方も見かけましたので、この記事が少しでもJavaFXの理解に役立つことを願ってやみません。

みなさんもよきJavaFXライフを!