最新のJava12でJavaFXを使う場合、
Java11以降でJavaFXがJDKから外れたので外部ライブラリーの使い方がわからないとコンパイル&実行ができない
Java9からJava言語仕様が追加されモジュールの概念が取り入れられました。これを理解しておかないと外部ライブラリーを用いたコンパイルや実行が正しく行えません。
こうした事情があってJavaFXは少々敷居の高いものになったようです。
このあたりは(B)Javaのモジュールの仕様、(A)EclipseなどのIDEにおける外部ライブラリーの参照設定方法を理解しておかないとうまく進められません。
自分は(※)Eclipse 2019-03 (Eclipse 4.11) + Java 12 Support for Eclipse 2019-03 (4.11) 4.11 (e(fx)clipseなし!)でやってみたのですが、module-info.javaを作らないと動かし方が面倒そうだったのでおとなしくmodule-info.javaにしかるべき内容を書いておきました。その内容については別の質問https://teratail.com/questions/191513#reply-284405で書いたので省略します。
それはさておき・・・こうした問題に対処するためには質問に以下の情報を明記するとよいと思います。
- OpenJFXのjarをプロジェクトへどのように追加したかの正確な手順
- 実行構成での各項目の設定内容
日本語でざくっと書く(OpenJFXは実行の構成VM引数にlibのPATHを入れました)よりは具体的なオプションをそのまま書いた方がよいと思います。
- module-info.javaを作っているかどうか。作っているならその内容はどうなっているか
- Applicationクラスのパッケージは何か
一部がなくても原因の特定はできそうですが、全部ないとどう書くべきか回答が書きづらい面があります。
ちなみに自分が気になった点があります。
OpenJFXは実行の構成VM引数にlibのPATHを入れました
これはうまい方法ではないと思います。多分より適切な方法はプロジェクトのビルドパスにOpenJFXのjar群を設定しておくことではないでしょうか。具体的な方法は
(1) Project > Properties
=>「Properties for プロジェクト名」のダイアログが開く。
(2) 左側にあるJava Build Pathを選択
(3) 右側にあるLibrariesタブを選択し、下に出てくる'Modulepath'を選ぶ
(4) 右側のAdd Library...ボタンを押す
=> Add Libraryダイアログが開く
(5) User Libraryを選びNext>を押す
(6) 右側のUser Libraries...を押す
=> Preferences (Filtered)ダイアログが開く
(7) New...ボタンを押す
=> New User Libraryダイアログが開く
(8) User library name:に"OpenJFX"などと入れてOKを押す
ダイアログが閉じて元のダイアログに戻る
(9) 上で追加したライブラリー名を選択
(10) 右にあるAdd External JARs...を押す
(11) ファイルダイアログでダウンロードしたOpenJFXのlibフォルダーの下にあるjarファイルを全て選ぶ(このあたりはWindowsの操作です。Macでも同様かはわかりません。多分Windowsより操作性が悪いってことはないと思います...)
(12) デバッグをしやすくするためにユーザーライブラリーに登録されている全てのJarのSource attachmentをlibフォルダにあるsrc.zipに設定しておくとよい(設定しなくても動くことは動く)
(13) ダイアログ下のApply and Closeを押す
User Libraryダイアログに戻るので今追加したライブラリー左にあるチェックボックスにチェックを入れる
(14) Finishボタンを押す
と、こんな感じです。
(Pleiadesを導入してないのでオリジナルのメニュー名です)
整理しますと
- 最新のEclipse 2019-03 (Eclipse バージョン 4.11)を使う
- Java 12 Support for Eclipse 2019-03 (4.11) 4.11をmarketplaceなどから導入
(早晩この手順は不要になるでしょう)
- module-info.javaにしかるべき内容を書く
- OpenJFXライブラリーはユーザーライブラリーとして定義しプロジェクトのモジュールパスへ追加しておく
- 実行構成にはmain class:にJavaFXのアプリケーションクラスを指定する
基本的にこれでOKだと思います。(e(fx)clipseが入っていると一部もっと簡単になるかも知れませんが入れてないのでわかりません><)