JavaFX 入門


overview

C#でWPFを使った開発を経験しているが、Javaでも同様の仕組みであるJavaFXが出たので、JavaFXが気になって仕方がない。

いまさらながら、調べてみようという話

現在SpringによるWebバックエンド開発が主な仕事なので、その辺の知識を生かしてうまいことJavaFXに適用できないかも模索してみる。

完全にJavaFXは初心者である

環境構築

JavaFXはJava11から本体から切り離された様子。 (この辺深堀している記事がありそうなので探そう。。。)

取り急ぎ、ググった結果ぱっと出てきたGluonが出しているOpenJavaFX11の環境構築を行った。

開発環境はもちろんWindowsなので、パッケージ管理にScoopを使う。

scoopの公式拡張bucketのjava bucketを追加してインストールする。

PS> scoop bucket add java
PS> scoop update
PS> scoop search javajfx
'java' bucket:
    gluon-openjfx-jmods-ea (15-5)
    gluon-openjfx-jmods-lts (11.0.2)
    gluon-openjfx-jmods (14.0.1)
    gluon-openjfx-sdk-ea (15-5)
    gluon-openjfx-sdk-lts (11.0.2)
    gluon-openjfx-sdk (14.0.1)
PS> scoop install gluon-openjfx-sdk-lts

もちろん、javaも必要なのでインストールしておく

PS> scoop install openjdk11

あと、画面を作成するためのXMLエディタとしてscene builderというものが存在する。

WPFの画面作成のアレと同じことができる。

これはscoopに存在しなかったので、適当に自分でscoop bucketを作ったので追加してインストール

PS> scoop bucket add my-bucket https://github.com/shibadog/my-bucket.git
PS> scoop update
PS> scoop search scene-builder
'my-bucket' bucket:
    gluon-scene-builder (11.0.0)
PS> scoop install gluon-scene-builder

これで実行環境と開発SDKのインストール完了。

エディタはvscodeを使う

PS> scoop search vscode
'extras' bucket:
    vscode-insiders-portable (nightly)
    vscode-insiders (nightly)
    vscode-portable (1.45.1)
    vscode (1.45.1)

'main' bucket:
    llvm (10.0.0) --> includes 'lldb-vscode.exe'
    winpython (3.8.2.0) --> includes 'winvscode.bat'
PS> scoop bucket add extras
PS> scoop update
PS> scoop install vscode

あ、ビルドツールはmavenを使うので、これもscoopで入れておく。

PS> scoop search maven
'main' bucket:
    maven (3.6.3)
PS> scoop install maven

vscodeには、諸々Java開発のための拡張機能など入れておいてね。

vscodeでの環境構築

取り急ぎ、mavenプロジェクトを作ってから開発しないといかんので、諸々ベースを作る。

PS> mvn archetype:generate
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1605:
Choose a number: 8:
Define value for property 'groupId': com.github.shibadog
Define value for property 'artifactId': javafx-test
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.github.shibadog: :
 Y: : y
PS> ls

Mode                LastWriteTime        Length Name
----                -------------         ------ ----
d-----       2020/05/23     22:32                javafx-test

あとラッパも作っておく

PS> cd javafx-test
PS> mvn -N io.takari:maven:0.7.6:wrapper

giboで適当にignore作っておく

PS> gibo dump VisualStudioCode Maven Java Eclipse >.gitignore

powershellだとUTF-16になっちゃうので(これなんとかならんのかいな)、vscodeで開いて文字コードをUTF-8に変えておく。

pomのjdkバージョンを11に変更

diff --git a/pom.xml b/pom.xml
index 4c0c6e2..e9aed17 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,8 +14,8 @@

   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.source>1.7</maven.compiler.source>
-    <maven.compiler.target>1.7</maven.compiler.target>
+    <maven.compiler.source>11</maven.compiler.source>
+    <maven.compiler.target>11</maven.compiler.target>
   </properties>

   <dependencies>

肝心のjavaFxの依存を追加

diff --git a/pom.xml b/pom.xml
index e9aed17..b2a3002 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,6 +19,16 @@
   </properties>

   <dependencies>
+    <dependency>
+      <groupId>org.openjfx</groupId>
+      <artifactId>javafx-controls</artifactId>
+      <version>11.0.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.openjfx</groupId>
+      <artifactId>javafx-fxml</artifactId>
+      <version>11.0.2</version>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>

これでもう作れるはず。 とりあえずMainクラスをJavaFXに改造

diff --git a/src/main/java/com/github/shibadog/App.java b/src/main/java/com/github/shibadog/App.java
index 351a4f4..afe5546 100644
--- a/src/main/java/com/github/shibadog/App.java
+++ b/src/main/java/com/github/shibadog/App.java
@@ -1,13 +1,20 @@
 package com.github.shibadog;

-/**
- * Hello world!
- *
- */
-public class App
-{
-    public static void main( String[] args )
-    {
-        System.out.println( "Hello World!" );
+import javafx.application.Application;
+import javafx.stage.Stage;
+
+public class App extends Application {
+
+    @Override
+    public void start(final Stage stage) {
+        try {
+            stage.show();
+        } catch (final Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(final String... args) {
+        Application.launch(args);
     }
-}
+}

実行の時にミソ。vscodeのlaunch.jsonでjavaFx用のモジュールを指定して実行するように設定を入れる。

vscodeのデフォルト設定でlaunch.jsonを作成する。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Debug (Launch) - Current File",
            "request": "launch",
            "mainClass": "${file}"
        },
        {
            "type": "java",
            "name": "Debug (Launch)-App<javafx-test>",
            "request": "launch",
            "mainClass": "com.github.shibadog.App",
            "projectName": "javafx-test"
        }
    ]
}

このあと、モジュール追加

diff --git a/.vscode/launch.json b/.vscode/launch.json
index c0f83a8..8e410e4 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -8,14 +8,16 @@
             "type": "java",
             "name": "Debug (Launch) - Current File",
             "request": "launch",
-            "mainClass": "${file}"
+            "mainClass": "${file}",
+            "vmArgs": "--module-path ${env:USERPROFILE}\\scoop\\apps\\gluon-openjfx-sdk-lts\\current\\lib --add-modules javafx.controls,javafx.fxml"
         },
         {
             "type": "java",
             "name": "Debug (Launch)-App<javafx-test>",
             "request": "launch",
             "mainClass": "com.github.shibadog.App",
-            "projectName": "javafx-test"
+            "projectName": "javafx-test",
+            "vmArgs": "--module-path ${env:USERPROFILE}\\scoop\\apps\\gluon-openjfx-sdk-lts\\current\\lib --add-modules javafx.controls,javafx.fxml"
         }
     ]
 }

これでやっとvscodeから起動ができる。

開発環境の構築完成!!