OpenJFX時代のJavaFXの始め方 - NetBeans + Maven編

今回から主要なIDEJavaFXの環境を整えて、サンプルを作るというところまでを解説していきます。主要なIDEというのは以下の3種類です。

はじめがNetBeansなのは、単に私が使い慣れているからです。

どれもJDKIDEがインストールされているという前提で説明します。Liberica JDKやZuleFXなどのJavaFXを含んだJDKを使う場合でも、JDKに含まれているJavaFXは使わずに一般のライブラリとして話を進めます。

なお、OpenJFX SDKは必要ありません!

MavenやGradleを使えば、Mavenのセントラルレポジトリから自動的にJavaFXをダウンロードするので、OpenJFX SDKをインストールする必要はないのです。

JavaFXのアプリケーションを作るには、それが一番手っ取り早いはずです。

NetBeans + Maven

NetBeansはもともとAntを使ってビルドや実行を行っていましたが、NetBeans 10.0からはAntよりもMavenやGradleの方に重きがかかっているようです。というのも、新規プロジェクトを作る場合、Mavenプロジェクトが先頭、Gradleが次、3番目になってやっとAntが登場しているからです。

今回使用したのはOracle JDK 12.0.2と、NetBeans 11.0です。JDKOracle OpenJDK以外のものでもかまいませんし、Java 12でなくてもJava 11でもOKです。

では、まずMavenJavaFXを始めてみましょう。

プロジェクト作成

はじめに行うのがプロジェクトの作成です。メニューバーの[File]-[New Project...]でプロジェクト作成のダイアログが表示されます。

f:id:skrb:20190713092525p:plain

もしくは左側ペインの[Projects]タブで右クリックして、ポップアップの[New Project...]でもOKです。

すると、プロジェクト作成が表示されます。

f:id:skrb:20190713093007j:plain

ここでは、Mavenを使うので、左側の[Categories]の[Java with Maven]を選択します。すると、右側にはプロジェクトの種類が表示されるので、この中から[Project from Archetype]を選びます。

注意
ここで[JavaFX Application]を選んではダメです!!

この[JavaFX Application]で作成するプロジェクトはJavaFX 8用なので、Java 11以降では使えません!!


MavenArchetypeは、プロジェクトのひな型のようなものです。MavenのCentral RepositryにはいろいろなArchetypeが登録されていますが、JavaFXのArachetypeもあるのです。

[Project from Archetype]を選択したら、[Next]で次に進みましょう。

次画面では、Archetypeを選択します。とはいうものの、Archetypeはいっぱいあるので、上部にある[Search]フィールドでArchetypeのフィルタリングをします。

JavaFXArchetypeはGroup IDがorg.openjfxなので、[Search]フィールドに"org.openjfx"、もしくは"openjfx"などを入力してみます。"javafx"だとJavaFX 8以前のArchetypeも表示されてしまうので、"openjfx"の方がよいです。

下の図では、"openjfx"でフィルタリングしたところです。

f:id:skrb:20190713094827p:plain

すると、[Known Archetypes]に、以下の2つのArchetypeが表示されます。

1つ目のjavafx-archetype-fxmlはFXMLを使用したJavaFXアプリケーション、2つ目のjavafx-archetype-simpleはFXMLを使用しないJavaFXアプリケーションになります。

まずは、FXMLを使用しないjavafx-archetype-simpleでやってみましょう。javafx-archetype-simpleを選択して、[Next]で先に進みます。

すると、プロジェクト名などを入力する画面に遷移します。

f:id:skrb:20190713095751p:plain

プロジェクト名やプロジェクトの場所などは、適当につけておいてください。ここではsimplefxdemoというプロジェクトにしました。

ダイアログの下の方の[Additional Creation Properties]でライブラリとプラグインのバージョンを設定することができます。2019年7月段階でのデフォルトではJavaFXが11.0.2、JavaFX Maven Pluginが0.0.1になっています。これらのバージョンは、プロジェクト作成してからでも変更できるので、今はこのままにしておきましょう。

設定ができたら、[Finish]でプロジェクトが作成されます。

プロジェクトの構成は以下のようになりました。

f:id:skrb:20190713100851p:plain

module-info.javaが存在していることから分かるように、このアプリケーションはモジュールになっています。でも、モジュールにしたくないのであれば、module-info.javaを削除すればOKです。

そして、Mavenのビルドファイルであるpom.xmlは次のようになっています。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.javainthebox</groupId>
    <artifactId>simplefxdemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11.0.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.1</version>
                <configuration>
                    <mainClass>net.javainthebox.simplefxdemo.App</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

使用するライブラリ(依存性のあるライブラリ)はに記載されています。上のpom.xmlにはjavafx-controlsしか記述していませんが、プロジェクトのDependenciesにはjavafx-baseなども含まれています。
これは、javafx-controlsが依存しているライブラリも、プロジェクトのDependenciesに表示されるからです。

Mavenプラグインに列挙されます。ここでは、maven-compiler-pluginとjavafx-maven-pluginが使用されています。maven-compiler-pluginはコンパイルのために使用し、javafx-maven-pluginはJavaFXアプリケーションのコンパイル、実行、パッケージングなどを行います。

なお、2019年7月での最新は、JavaFXが12.0.1、JavaFX Maven Pluginが0.0.2です。必要に応じて、pom.xmlのバージョン記述をあげておいた方がいいと思います。

プロジェクトの実行

このプロジェクトはそのままでも実行できるので、実行してみましょう。

とはいうものの、NetBeansのメニューバーの[Run]-[Run Project]では、すぐには実行できません。単に[Run Project]ではJavaFXのお約束のモジュール指定などを行わないからです。

それらを行うためにJavaFX Maven Pluginがあるのです。JavaFX Maven Pluginでアプリケーションを実行するには、Mavenのゴールとしてjavafx:runを使用します。

NetBeansMavenのゴールを直接指定するには、プロジェクトを右クリックして表示されたポップアップメニューから、[Run Maven]-[Goals...]を選択します。

f:id:skrb:20190713102806p:plain

すると、ゴールを指定するダイアログが表示されるので、[Goals]の欄に"javafx:run”を入力します。

f:id:skrb:20190713102959p:plain

[OK]でゴールを実行します。すると、下の図のようなウィンドウが表示されるはずです。

f:id:skrb:20190713103156p:plain

もう、JavaFXのアプリケーションが実行できてしまいました。とはいうものの、毎回ゴールを指定するのもめんどうです。

そこで、NetBeansですぐに実行できるように設定してみましょう。

MavenのゴールとNetBeansのアクションを結びつけるという設定を行うのですが、それにはプロジェクトのプロパティから行います。

プロジェクトを右クリックして表示されたポップアップメニューの一番下に[Properties]があるので、それを選択します。

f:id:skrb:20190713202114p:plain

すると、設定用のダイアログが表示されます。

ダイアログの左側の[Categories]から[Actions]を選択すると、右側にアクションの一覧が表示されます。この中で、[Run project]を選択します。

f:id:skrb:20190713202402p:plain

[Execute Goals]に表記されている内容が、[Run project]に割り当てられているゴールです。

デフォルトではExec Maven Pluginのexecが使われていることが分かります。この部分をJavaFX Maven Pluginのjavafx:runに変更します。また、[Set Properties]に記載されているプロパティは必要ないので、削除します。

f:id:skrb:20190713202920p:plain

[OK]で設定完了です。

では、プロジェクトの右クリックで、ポップアップメニューの[Run]を実行してみましょう。もしくは、メニューバーの[Run] - [Run Project]、あるいはファンクションキーのF6でも実行できます。

正しく設定ができていれば、上述したウィンドウが表示されるはずです。

この設定を行うと、プロジェクトのpom.xmlと同じ場所にnbactions.xmlというファイルが作成されます。このファイルに、ここで行った設定が記述されます。

<?xml version="1.0" encoding="UTF-8"?>
<actions>
        <action>
            <actionName>run</actionName>
            <packagings>
                <packaging>jar</packaging>
            </packagings>
            <goals>
                <goal>javafx:run</goal>
            </goals>
        </action>
    </actions>

なお、javafx:runだけではビルドが必須ではないので、毎回ビルドをし直すのであればclean javafx:runのように記述してビルドを強制させるようにします。

後は、このプログラムをベースに拡張を行っていけばOKです。ただ、GUI部品が増えてくるとコードがとても見にくくなってきます。そこで、使うのが次節で扱うFXMLです。

FXMLプロジェクト作成

FXMLはXMLGUIの画面構成を記述するファイルです。FXMLはペアとなるJavaファイルが存在し、通常コントローラークラスと呼ばれます。コントローラークラスにはGUI部品で発生したイベントの処理を記述します。

FXMLには画面構成を記述しますが、それと一緒にGUI部品をコントローラクラスで扱うためのIDや、イベント発生時にコールするコントローラクラスのメソッドも記述します。

では、FXMLを使用したプロジェクトを作成していきましょう。

FXMLを使ったプロジェクトも、Mavenarchetypeで作っていきます。

プロジェクト作成の手順はarchetypeを選択するまでは、先ほどと同じです。先ほどはarchetypejavafx-archetype-simpleを選択しましたが、FXMLを使う場合はjavafx-archetype-fxmlを選択します。

f:id:skrb:20190718152457p:plain

プロジェクト名の入力画面は先ほどの例と同じですね。ここでは、simplefxmldemoというプロジェクト名にしました。

プロジェクトの構成は以下のようになっています。

f:id:skrb:20190718155532p:plain

先ほどのサンプルと同じようにAppクラスがメインのクラスです。その他に2つのクラスが存在していますが、クラス名にControllerが含まれることから分かるように、コントローラークラスになります。

FXMLはリソースの方に分類されています。ここでは2つのFXMLファイルが存在しています。

primary.fxmlファイルとPrimaryControllerクラス、secondary.fxmlファイルとSecondaryControllerクラスがペアになっています。

このサンプルもそのままで実行できるので、実行してみましょう。実行のための設定は、先ほどのサンプルと同じです。

f:id:skrb:20190719143422p:plain

実行するとボタンが1つのステージが表示されます。このボタンをクリックすると、2番目の画面に切り替わります。2番目の画面のボタンをクリックすると、再び1番目の画面に遷移します。

Scene Builder

このアプリケーションを改造していく、もしくは新たにFXMLを作成するような場合、FXMLをグラフィカルに編集できるツールがほしいところです。この用途に使えるツールとしてScene Builderがあります。

Scene Builderはオープンソースで開発されていますが、Gluonがバイナリを配布しているので、それを使うのが手っ取り早いです。なお、Oracleで配布しているScene Builderは古いバージョンで、JavaFX 2の頃のものです。JavaFX 8を使う場合でも、Gluonからダウンロードできるバイナリを使用してください。

gluonhq.com

Scene BuilderはインストーラもしくはRPMなどのパッケージが配布されているので、それにしたがってインストールしてみてください。

ただ、Windows版は日本語環境だと文字化けを起こすので、今のところ英語で使うしかないです。

Scene Builderをインストールしたディレクトリの直下にあるappディレクトリにSceneBuilder.cfgというファイルがあります。このファイルを開くと[JVMOptions]という項目があるはずです。

この項目には--add-opensが記載されていますが、これに加えて-Duser.language=enを記述します。

[JVMOptions]
-Duser.language=en
--add-opens
javafx.fxml/javafx.fxml=ALL-UNNAMED

これで、Scene Builderは英語表記になります。

このバグ、日本語のプロパティファイルが壊れているせいで、エラーの報告もされているんですけど、直らないんですよね...

次に、NetBeansからScene Builderを呼び出せるように設定します。

まず、メニューバーの[Tools]-[Options]を選択します。

f:id:skrb:20190721212125p:plain

すると、オプション設定のダイアログが開きます。

f:id:skrb:20190721212350p:plain

上段のカテゴリーの中から[Java]を選択し、タブの中から[JavaFX]を選択します。はじめて[JavaFX]を選択すると、JavaFXをアクティベートしてから上記のように表示されます。デフォルトでは[Scene Builder Home]の欄は空白になっているので、SceneBuilderをインストールしたディレクトリを指定します。

その下の[Save All Modified Files Before Running Scene Builder]はチェックしてもしなくてもOKです。チェックしておいた方が間違いは少ないとは思います。

これで、NetBeansでFXMLをダブルクリック、もしくは右クリックしてポップアップメニューの[Open]を選択すると、Scene Builderが起動し、指定したFXMLファイルをオープンします。

たとえば、primary.fxmlをダブルクリックすると、以下のような画面になります。もし、Scene Builderが起動しない場合は、NetBeansを再起動してみてください。

f:id:skrb:20190722152833p:plain

ちなみに、FXMLをNetBeansで開きたいときは、FXMLを右クリックして、ポップアップメニューの[Edit]を選択します。

これで、グラフィカルにFXMLを変数する用意ができました。あとは、このサンプルをベースに改良するか、新たに作成していくかして、アプリケーションを作っていけるはずです。

まとめ

NetBeansMavenを使ったJavaFXの開発環境を整える方法を紹介しました。簡単にまとめると

  • JavaFXArchetypeを使えば、JavaFXアプリケーションのひな型は簡単に作成できる
  • コンパイル、実行などはNetBeansから行うが、多少の設定は必要
  • FXMLの編集にはScene Builderを使用し、NetBeansから使えるようにしておくと便利

今回は、環境構築とアプリケーションのひな型を作るだけでした。次回は、今回の続きで、実際にひな型を拡張してアプリケーションを作る説明をしていきます。

追記

このエントリーを公開した前日にNetBeans 11.1がリリースされました!

JavaFXに関しては大きな変更はないのですが、サンプルの中にOpenJFXが追加されました。このサンプルを使用すれば、上記のMavenのプロジェクトをarchetypeを使わずに作成することができます。

また、nbactions.xmlも含まれているので、javafx:runをゴールに指定する必要もありません。

OpenJFXのプロジェクトを作成するには、[New Project...]で表示されるダイアログの中から、カテゴリーを[Samples]-[OpenJFX]にします。

f:id:skrb:20190729063434p:plain

[Samples]の中には[JavaFX]もありますが、こちらはJavaFX 8とJava SE 8の組み合わせなので、Java 11以降では使用できません。

[HelloFXWithMaven]か[HelloFXMLWithMaven]を選択して、[Next]で、プロジェクト名などの入力画面に切り替わります。デフォルトだとプロジェクト名がHelloFXWithMavenもしくはHelloFXMLWithMavenになっているので、必要におうじて変更してください。

後は、Mavenarchetypeを使って作成したプロジェクトと同じです。前述したようにnbactions.xmlはすでに設定してあるので、実行もすぐにできるはずです!