Java初心者がjavafxでGUIプログラミング

現状

OpenJDKとはなんぞやという人間が、JavaでGUIアプリケーションを作りたくなった。そんなに大層なものではなく、ニコニコ動画の軽量プレイヤーが作りたかっただけなのでjavafxを使うことにしたが、Scene Builderなんて初心者が使いこなせるとは思えないし、モチベーションを保つ自信がない。

最終的にOpenJDK13とJavafxを使ってGUIアプリケーションを作った。この記事ではアプリケーションを作成した環境を再構築する時のために、開発環境を用意するための手順を書き残すことにした。
IDEは今現在もっとも新しいEclipse2019-09を使う。Eclipseの公式サイトにはFull Editionをオススメすると書かれているが、HDD容量の関係でStandard Editionをインストールした。
https://mergedoc.osdn.jp/

環境

  • macOS Mojave ver.10.14.6
  • Open Java Development Kit 13.0.1
  • JavaFX 13

OpenJDK13はbrewでインストールされていた。公式サイトにダウンロードページがあったので、そこからダウンロードしてインストールする方法もあるのだと思う。
https://jdk.java.net/13/

JavaFXは公式サイトからダウンロードしてきた気がする。Latest ReleaseのJavaFX13をダウンロードしてインストールする。
https://gluonhq.com/products/javafx/

アプリケーション作成時はJavaFXのインストール先を/usr/local/lib/javafx-sdk-13.0.1にしておいたが、プロジェクト内のディレクトリに入れた方が一般的なのだろうか…🤔
今回はプロジェクト内のディレクトリにインストールして進めていくことにした。

プロジェクト作成

新規プロジェクトを作成し、プロジェクト名のみ入力した。JREやレイアウトなど他の項目については、デフォルトから変更していない。

「次へ」ボタンを押して他の項目の設定ページを開いたものの、現状変更するところもないので「完了」ボタンを押す。

作成直後のプロジェクトの状態

プロジェクト作成直後は上記のような状態になっている。ここにlibディレクトリを作成し、プロジェクトに必要なライブラリを入れていく。

早速プロジェクト名を右クリック、「新規」から「フォルダー」を選択する。フォルダー名は「lib」にした。

ライブラリをインポート

先ほど作成したlibディレクトリに、アプリケーションに必要なライブラリをインポートする。

libを右クリックして表示されるメニューからインポートを選択する。新しくウィンドウが表示されるので、一覧の中の「一般」から「ファイル・システム」を選択して、「次へ」ボタンを押す。
javafx内のlibディレクトリが存在するディレクトリを参照、選択して「完了ボタン」を押す。

なんだかlibディレクトリがごちゃごちゃしてて汚いので、javafxという名前のフォルダを作成し、そこに今インポートしたjavafxのファイルを全て入れておいた。

ただこの作業結構手間に感じる。エクスプローラーから直接javafxライブラリをプロジェクトのlibディレクトリに入れてしまうのが楽な気もする。

JavaFXライブラリのパス設定

プロジェクト名を右クリックして「プロパティ」を選択する。左の設定項目一覧から「Javaのビルド・パス」をクリックする。

「モジュールパス」が選択されている状態で、右の「ライブラリの追加」ボタンをクリックし、新しく表示される画面から「ユーザー・ライブラリー」を選択して「次へ」ボタンを押す。

右の「ユーザー・ライブラリー…」ボタンをクリックする。

ユーザーライブラリの登録画面が表示されるので右の「新規」ボタンをクリックして、登録したいユーザーライブラリの名前を入力する。わかりやすく、ここでは「javafx」とした。

先ほど追加したユーザーライブラリ「javafx」を選択し、右の「JARの追加…」ボタンをクリックする。すると、プロジェクトの構成が表示されるので、libの中のjavafxライブラリを全て選択して「OK」ボタンを押す。
画像ではjavafx.propertiesが含まれてしまっているが、これは選択を外すこと。

ユーザーライブラリを選択するウィンドウに戻ってくるので、先ほど追加したユーザーライブラリ「javafx」にチェックを入れて完了ボタンを押す。

実行/デバッグ環境設定

次に「実行/デバッグ環境」を設定していく。

「引数」タブに切り替え、VM引数に「–add-modules javafx.controls」と入力する。
次に「SWTで起動する場合は -XstartOnFirstThread引数を使用する」のチェックを外す。このチェックを外さないとMacOSではアプリケーションが起動しなかった。

「依存関係」タブを開き、クラスパス・エントリーを選択する。右の「拡張…」ボタンを押し、「ライブラリーの追加」ラジオボタンを選択して「OK」ボタンを押す。
「ユーザー・ライブラリー」を選択して「次へ」ボタンを押すと、先ほど追加した「javafx」が存在するのでそれにチェックを入れて「完了」ボタンを押す。

Hello World!

JavaFXを使ってHello Worldと表示されるアプリケーションを作成する。

プロジェクトのsrcディレクトリで右クリック、「新規」から「パッケージ」を選択する。フォルダ名は「main」とした。

次にクラスを作成する。先ほど作成したmainパッケージを右クリックして「新規」から「クラス」を選択する。名前は「App」とした。

package main;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

あとは実行するだけ。
プロジェクト名を右クリックし、「実行」の「Javaアプリケーション」を選択するとタイトルにHello Worldと書かれたウィンドウが表示される。

注意したいのはjavafxで使う機能によって、実行/デバッグ環境の設定を変更する必要があること。
例えば、VM引数の–add-modulesにモジュール名を追加していく必要がある。モジュールが複数ある場合は半角のカンマ(,)で区切れば良い。