1
1

More than 1 year has passed since last update.

JavaFX周りの備忘録

Last updated at Posted at 2022-09-03

本記事の前提事項

※記事を書いている人は過激派です。

どっか行けヽ( ・∀・)ノ┌┛Σ (Eclipse)

三(メモ帳) ლ(^o^ლ)おいで
三(コマンドプロンプト) ლ(^o^ლ)おいで

前段

JavaFXと言えば、JavaでGUIアプリケーションを作るときに使われる便利なフレームワークだ。
AWT、Swingといった旧来のフレームワークよりも簡潔に、そして表現力を豊かにしたフレームワークだ。

基本的にはjavafx.application.Applicationクラスを継承したクラスを定義し、GUIをFXMLで定義し、Controllerクラスを定義してイベントハンドラを割り当てたりする。

Java8の頃にはJDKにも組み込まれ、作ったjavaファイルをコンパイル→jarファイルに変換すれば、java -jar App.jarだとかで走らせることができた。

そんなJavaFX君に悲劇が…

2018年頃だっただろうか、Java8からJava11への変更に伴い、JDKから追い出されてしまったのだ。
まるで幼児がニンジンやピーマンを皿の脇に追いやるようにっ…!

じゃあどうするんだ、と

OpenJFXを使え、と。(同梱してくれても良いジャマイカ)
おかげさまで開発準備も面倒になり、Module Systemの導入によりコンパイル作業も面倒になってしまった…omg
そんな面倒ごとの備忘録として、この記事を残す。

環境準備

ファイルのダウンロードとか

Java11の環境をこさえるために、OpenJDKOpenJFXをダウンロードする。
OpenJDKは解凍して適当なフォルダに入れておく。(ここではC:/Program Files/Javaとする)
OpenJFXも解凍し、同じフォルダに入れておく。
この時点で、フォルダ構成は下記の通り。

C:/Program Files/Java
+-- javafx-sdk
|   +-- bin
|   +-- legal
|   `-- lib
+-- javafx-jmods
|   `-- *.jmod
`-- jdk
    +-- bin
    +-- conf
    +-- include
    +-- jmods
    +-- legal
    `-- lib

環境変数作る

JAVA_HOMEにJDKのパスを、JAVAFX_HOMEにSDKのパスを貼り付ける。
ついでに、Path%HAVA_HOME%\binを追加しておく。
基本的なコマンドが通ればおk。

プロジェクト用のフォルダを作る

細かい説明は省略。

JavaFXDemo
+-- bin
+-- dest
+-- res
|   +-- layout
|   |   `-- layout.fxml
|   `-- icon.png
+-- src
|   +-- javafxdemo
|   |   +-- icon.ico
|   |   +-- module-info.java
|   |   +-- MainApplication.java
|   |   `-- MainController.java
|   `-- MANIFEST.MF
`-- compile.bat

FXMLを使わないなら、layoutとかMainController.javaは不要。

作ってみる

準備した環境で動くか確認する。

プログラムを書く

MainApplication.java

MainApplication.javaにはStageの表示とかのプログラムを書いておく。
FXMLはFXMLLoaderで読み込んで、Stage#setScene(Scene scene);で割り当てる。(ここでは省略)

MainApplication.java
package com.example;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.stage.Stage;

public class MainApplication extends Application {
  @Override public void start (Stage primaryStage) {
    // (ry
    primaryStage.show();
  }

  public static void main (String[] args) {
    Application.launch(MainApplication.class, args);
  }
}

MainController.java

ここはクラスを定義するだけ。
強いて言うなら、javafx.fxml.Initializableを実装すると良いかも。
FXMLで指定したイベントハンドラとかは、アノテーション(@FXML)を使って記載する。

module-info.java

面倒になった諸悪の根源の1つ。
ほとんど定型なのでコピペする。
コンパイルでエラー吐いたら、requiresとかopensが正しいか見る。

module-info.java
module javafxdemo {
  exports com.example.javafxdemo;
  requires java.desktop;
  requires javafx.controls;
  requires javafx.fxml;
  opens com.example.javafxdemo to javafx.fxml, javafx.graphics;
}

コンパイル用のbatを作る

もっと綺麗に書くべきだろうけど、分かりやすいのでコピペする。
難しいことは考えたら負け。
C:\Program Files\Java\javafx-jmods辺りは環境変数にしておいて良いかも。
モジュール周りは適宜変更する。

compile.bat
@echo off
setlocal
if exist bin rd /s /q bin
md bin
if exist dest rd /s /q dest
md dest
set package_name=com.example.javafxdemo
set module_name=javafxdemo
set manifest_file=src\MANIFEST.MF
set jar_file=dest\JavaFXDemo.jar
set launcher=JavaFXDemo=%module_name%/%package_name%
javac -d bin -encoding utf-8 --module %module_name% --module-path "%JAVAFX_HOME%\lib" --module-source-path src -Xlint:unchecked
xcopy /s /y res bin\%module_name%\res\
jar cvfm %jar_file% %manifest_file% -C bin\%module_name% .
jlink --add-modules %module_name% --compress=2 --launcher %launcher% --module-path "dest;%JAVA_HOME%\jmods;C:\Program Files\Java\javafx-jmods" --output dest\%module_name%
dest\%module_name%\bin\JavaFXDemo
cmd /k
endlocal
@echo on

コンパイルとか

コマンドプロンプトからcompileを実行する。
ブランクの画面が表示されればおk。
エラー吐かれたら調べて対応する。

まとめ

ど う し て こ う な っ た

Androidのファイル操作周りが厳格になったり、安全性が重視される世の中なのは理解する。
でも、開発の簡単さをもう少し…ほんの少しで良いので…

…まぁ正直、JavaFXで作るよりもPythonとかで作った方が楽な気もする()

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1