2018-10-21

JavaFX 11 と Netbeans 9.0

Oracle は、先月(米国時間の 2018 年 9 月 25 日)に Java SE 11 / JDK (Java Development Kit) 11 の一般提供を開始しましたが、このリリースから JavaFX のパッケージが削除されてしまいました [1]。JavaFX でちょっとした GUI プログラムを作って業務にも使っていたので、しばらくは JDK 11 に移行せずに古い JDK を使い続けるしかないかなと思っていました。

しかし、JDK 11 がリリースされる一週間前の 9 月 18 日 (UTC) に、単独で JavaFX 11 がリリースされていたのでした [2]。JavaFX に関する情報収集に精を出していなかったせいもあって、JavaFX 11 の存在に気が付い時にはリリースから一カ月近くが経過していました💦。実は Java 11 のリリースノート [1] には、この JavaFX 11 についての情報も記載されていたのですが…、リリース・モデル [3] の変更についての話題に気を取られ、全然読んでいませんでした。

しかしこれで NetBeans 9.0 で JavaFX のアプリケーションのビルドができると意気込み、悪戦苦闘したものの、なんとか、こつこつ作っている JavaFX のアプリケーションのビルドに成功したのでした。そのアプリケーションは紹介できないので、テスト用にバージョンを確認する小さな JavaFX プログラムのスクリーンショットを載せました。

Windows 7 上での JavaFX 11 アプリケーション実行例

目的と Linux の使用環境

今回の目的は、Java 8 で利用していた JavaFX のプロジェクトを、Java 11 の環境へ移行することです。ただし、Netbeans 9.0 を開発環境に使っている場合に限定します。移行するサンプルとして JavaVersion という簡単なプロジェクトを使います。この記事の終わりにコードを紹介しています。

自宅で Linux 環境でも同じように Java 11 へ移行して、JavaFX 11 を利用できるかどうか確認しました。Fedora 29 beta から OpenJDK 8 と 11 を共存させていたのですが、OpenJDK 8 の方を完全に削除しました。使用環境は以下の通りです。

  • OS: Fedora 29 beta (x86_64)
  • IDE: Apache NetBeans IDE 9.0 (Build incubator-netbeans-release-334-on-20180708)
  • java-11-openjdk-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-devel-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-headless-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-javadoc-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-src-11.0.0.28-1.fc29.x86_64

Wayland に未対応

JavaFX 11 のリリースノート [4] を読むと、Ubuntu 18.04 で Wayland のウィンドウサーバーを有効にすると JavaFX 11 がクラッシュするとあります。これは、このバージョンから JavaFX のコードが GTK 3 へ移行したことに原因があるようです。これは Ubuntu 固有の問題ではなく、Fedora でも確認できました。

これを回避する方法として次の二点が紹介されています。

  1. Wayland を使わず Xorg を使う。
  2. 強制的に GTK 2 を使う。java -Djdk.gtk.version=2 ...

将来この問題が GTK 3 の環境下で解決されることを期待して、ひとまずログイン時にデフォルトの Wayland ではなく、Xorg を明示的に指定 (GNOME on Xorg) して対応することにします。

GNOME ログイン時に Wayland を無効に(GNOME on Xorg を選択する)

※ これからの説明は、参考サイト [5] の内容を確認し、自分の環境に合わせて書き直したものです。

JavaFX 11 のダウンロードとライブラリの登録

参考サイト [6] から、JavaFX Linux SDK (openjfx-11_linux-x64_bin-sdk.zip) をダウンロードして、適当なディレクトリに展開します。私は、ホームディレクトリ内に lib ディレクトリを用意しておいて、その中に展開しています。

Netbeans を起動して、メニューバーから Tools → Libraries を選び、Ant Library Manager ダイアログの画面左下の New Library ... ボタンをクリックして、展開しておいた /home/bitwalk/lib/javafx-sdk-11/lib/ 内の jar ファイルを選択して JavaFX という名前を付けてライブラリに登録しておきます。

JavaFX ライブラリの登録

Netbeans 9.0 で JavaFX のプロジェクトは作れない

JDK 11 には JavaFX 11 の SDK が含まれていないので当然ですが、Netbeans 上で JavaFX プロジェクトを作成することはできません。

JDK 11 での JavaFX プロジェクトの作成

Netbeans 9.0 でモジュール用プロジェクト ModuleTest を作成

メニューバーから Files → New Project... を選び、New Project のダイアログ画面の Choose Project のステップにおいて Categories のリストから Java、Projects のリストから Java Modular Project を選択して Next > ボタンをクリックします。

Name and Location ステップで、プロジェクト名などの設定をします。ここでは Project Name を ModuleTest として Finish ボタンをクリックしてプロジェクトの作成を完了します。

モジュール用プロジェクト ModuleTest の作成

ここでは、今まで Java のバージョンを表示する JavaFX のプロジェクト JavaVersion を新しく作成したモジュール用プロジェクトにコピーするため、プロジェクトのペインに表示しています。JavaVersion が赤字になっているのは、この環境ではエラーがあってビルドできないからです。

JavaFX ライブラリの追加

さて、作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。

モジュール用プロジェクト ModuleTest のプロパティ画面表示

左側の Categories から Libraries を選び、右側の Compile タブを表示します。Compile-time Libraries で Modulepath の行右側の ボタンをクリックして、メニューから Add Library... を選びます。

Add Library のダイアログで、あらかじめ登録しておいた JavaFX を選択して Add Library ボタンをクリックして追加します。

Modulepath に JavaFX ライブラリが追加されたことを確認してから OK ボタンをクリックして Project Properties - ModuleTest のウィンドウを閉じます。

JavaFX ライブラリの追加

モジュールの作成

次に、再度作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、New → Module を選択して新しいモジュールを作成します。

モジュールの作成

ここでは Module Name を javafxApp として Finish ボタンをクリックします。

モジュール javafxApp モジュールの作成

するとモジュール定義ファイル module-info.java がクラスディレクトリ ModuleTest/src/javafxApp/classes のトップに生成されて、右側のエディタのペインに表示されます。

空のモジュール定義ファイル module-info.java

生成された module-info.java には、以下のように依存するモジュールと公開するモジュールを記述します。

リスト:module-info.java 

記述後の module-info.java は以下のようになります。

モジュール定義ファイル module-info.java

以前のプロジェクトで利用していたパッケージを ModuleTest プロジェクトへコピーします。

既存のパッケージを ModuleTest プロジェクトへコピー

メインプロヘクト、メインクラスの指定とコンパイル、実行

メニューバーから Run → Set Main Project から ModuleTest を選んでメインプロジェクトに設定します。

メインプロジェクトの設定

再び、左側のプロジェクトのペインで ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。左側の Categories から Run を選び、右側の Main Class のエントリに起動するメインクラス javaversion.JavaVersion を入力して OK ボタンをクリック、プロパティ画面を閉じます。

メインクラス javaversion.JavaVersion の設定

キーボード F6 を押して、プロジェクトをコンパイル、実行します。

Fedora 29 上での JavaFX 11 アプリケーション実行例

JavaVersion プロジェクトのソースコード

ご参考までに、今回使用した JaveVersion プロジェクトのソースコードとイメージを紹介しておきます。

リスト:JavaVersion.java 

リスト:JavaVersion.css 

image/java-logo.png

参考サイト

  1. JDK 11 Release Notes, Important Changes, and Information
  2. JavaFX 11がリリース - クロスプラットフォームのGUIライブラリ | ソフトアンテナブログ
  3. JDKの新しいリリース・モデル、および提供ライセンスについて
  4. openjdk-jfx/release-notes-11.md at jfx-11 · javafxports/openjdk-jfx
  5. netbeans - JavaFX deployment library not found in active JDK - Stack Overflow
  6. JavaFX - Gluon
  7. JavaFX (https://openjfx.io/)
  8. bitWalk's: Apache NetBeans 9.0

 

ブログランキング・にほんブログ村へ
にほんブログ村