JavaFXでHelloFX

# はじめに
はじめまして。
この記事は[ITRC Advent Calendar 2019](https://adventar.org/calendars/4759)の5日目の記事になります。
今回はJavaFXでHelloWorldの様に「Hello,JavaFX」を表示させるところまでやりたいと思います。

# 環境
- ArchLinux
- Java11
- Eclipse

# HelloJavaFX
では、HelloJavaFXを表示してみましょう。

## JavaFXのダウンロード
[こちら](https://gluonhq.com/products/javafx/)からJavaFXを任意の場所にダウンロードしてきます。
今回はVersion11.0.2をダウンロードしました。
![2019-12-05-171217_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/ba409d5d-b22e-3514-688d-fd54744fdb03.png)

## Eclipse 1
次にEclipseを開いて、メニューバーから
ヘルプ→Eclipseマーケットプレースを選択します。
検索スペースに「e(fx)clipse」と入力するとでてくるので、それをインストールします。
![2019-12-05-170957_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/11bfb40f-e142-d3ea-3df2-db742a6756a8.png)

続いて、新しくJavaFX用のプロジェクトを作成します。今回はHelloJavaFXで作成。
その後に新しくパッケージを作成します。パッケージを作成しないでデフォルトパッケージでやってしまうと後々大変です。今回はhellojavafxで作成。
（そもそもデフォルトパッケージを使うのはあまり良くないとか聞いたので）
module-info.javaは後で作成しますが、今は作らないでおきます。

![2019-12-05-172333_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/04397ddd-ff34-5e19-4844-7ff590076ee8.png)


続いて、先程ダウンロードしてきたJavaFXを展開してください。展開すると`legal`と`lib`の2つがあると思います。
(Windowsでは`bin`もあるらしいのですが、Linuxはなかったです)

Eclipseに戻って、作ったプロジェクトで右クリックし
ビルド・パス → ビルド・パスの構成 を選択
ライブラリーを選択してモジュールパスを選択し、右側の外部JARの追加を選択します。
先程解凍したJavaFXの中にあった`lib`にまでいくと、9個のファイルがあると思うので、その中の`.jar`ファイルのみ選択して開くを押してください。

![2019-12-05-172959_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/9b7d6352-dbcf-ee7f-9337-62ac760bd33b.png)

これで追加されたので、適用して閉じてください。プロジェクトに「参照ライブラリー」が追加され、先程追加した`.jar`ファイルが入っていると思います。


## ソースコード
次に、コードを書いていきます。今回はHelloFX.javaで作成。

```java
package hellojavafx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class HelloFX extends Application {

	@Override
	public void start(Stage stage) {
		Label label = new Label("Hello, JavaFX");
		label.setFont(new Font(50));
		stage.setScene(new Scene(new StackPane(label), 500, 400));
		stage.show();
	}

	public static void main(String[] args) {
		launch();
	}
}
```

### 内容

Labelの作成

```
Label label = new Label("Hello, JavaFX");
```

フォント指定

```
label.setFont(new Font(50));
```

stageにSceneをセット、SceneでPaneを表示(Label)、ウィンドウの大きさ指定(Width,Height)

```
stage.setScene(new Scene(new StackPane(label), 500, 400));
```

ウィンドウを表示

```
stage.show();
```

アプリケーションを起動

```
launch();
```

## Eclipse 2
特にソースコードにエラーはでていませんが、実行してみると、コンソールでエラーが表示されて何もできません。

```
エラー: メイン・クラスhellojavafx.HelloFXを検出およびロードできませんでした
原因: java.lang.NoClassDefFoundError: javafx/application/Application
```

ここで、プロジェクトを作った時に作成しなかったmodule-info.javaを作成します。
プロジェクトで右クリックし、
構成 → module-info.javaの作成 を選択
モジュール名はなんでも良いですが、デフォルトで表示されているプロジェクト名と同じもので作りましょう。作成されると、すでに中身が書いてあると思います。

```java

module HelloJavaFX {
	exports hellojavafx;

	requires javafx.base;
	requires javafx.controls;
	requires javafx.graphics;
}
```

`export`はパッケージの公開。
`requires`はモジュールの読み込み。

新Javaプロジェクト作成時に作らなかった理由は、最初に作成すると中身が何もないので、このタイミングで作成したほうがそれだけで終わるので楽だからです。

これで実行してみましょう。

![2019-12-05-184831_1366x768_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543602/d7d23ce3-9239-546c-a9d5-ddff393c2271.png)


今度はしっかり実行できました。

余談ですが、MACを使っている人でJavaFXを使おうとした時に、アイコンは表示されるがウィンドウが表示されないという現象が起こってました。調べたところ、MACで使用する場合には実行の構成の引数にある「XstartOnFirstThread」のチェックボックスをを外すと解決しました。
[こちら](https://stackoverflow.com/questions/56776190/cannot-launch-a-javafx-application-on-macos-using-java-8)を参考

# まとめ
今回はHello Worldみたいな感じでした。
気が向いたら、Hello World以降の何かを書こうかなと思います。