JavaFXでBMI計算アプリを作ってみる。

# 経緯
以前JavaScriptでも作成したBMI計算アプリをJavaFXでも作成することにした。

# 環境構築
①eclipseマーケットプレイスからプラグイン（e(fx)clipse）のインストール
②OpenJFXのインストール
⇒Javaのビルドパスにてライブラリの追加が必要。
⇒libフォルダ内のsrc.zip以外すべてのjar
③Scene Builderのインストール

# ディレクトリ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/0e1750c2-0212-5b7b-a5fe-d916d18d48cd.png)

# ソースコード
Main.java
```java
package application;
	
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
			Scene scene = new Scene(root,600,400);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

```

Sample.fxml
```xml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.text.*?>
<?import javafx.scene.web.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="application.SampleController">
   <children>
   	<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   		<children>
   			<Label alignment="CENTER" layoutX="7.0" layoutY="6.0" prefHeight="69.0" prefWidth="590.0" text="BMI計算">
   				<font>
   					<Font size="67.0" />
   				</font>
   			</Label>
   			<Label alignment="CENTER" layoutX="96.0" layoutY="129.0" prefHeight="37.0" prefWidth="120.0" text="身長" />
   			<Label alignment="CENTER" layoutX="96.0" layoutY="182.0" prefHeight="37.0" prefWidth="120.0" text="体重" />
   			<TextField fx:id="cm" layoutX="231.0" layoutY="132.0" />
   			<TextField fx:id="kg" layoutX="231.0" layoutY="185.0" />
   			<Button layoutX="463.0" layoutY="232.0" mnemonicParsing="false" onMouseClicked="#onClick" text="計算する" />
   			<Label fx:id="result" alignment="CENTER" layoutX="100.0" layoutY="300.0" prefHeight="67.0" prefWidth="415.0" text="">
   				<font>
   					<Font size="46.0" />
   				</font>
   			</Label>
   		</children>
   	</AnchorPane>
   </children>
</BorderPane>

```

SampleController.java
```java
package application;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;

public class SampleController {

	@FXML
	private TextField cm;

	@FXML
	private TextField kg;

	@FXML
	private Label result;

	@FXML
	void onClick(MouseEvent  event) {
		String w = kg.getText();
		String h = cm.getText();
		

		double weight = Double.parseDouble(w);
		double height = Double.parseDouble(h);
		
		height /= 100;

		double bmi = bmiCalc(weight, height);

		if (bmi < 18.5) {
			result.setTextFill(Color.BLUE);
			result.setText("貴方は、やせ型です！");

		} else if (18.5 <= bmi && bmi < 25) {
			result.setTextFill(Color.GREEN);
			result.setText("貴方は、標準です！");

		} else if (bmi >= 25) {
			result.setTextFill(Color.RED);
			result.setText("貴方は、肥満です！");
		}
	}

	public double bmiCalc(double weight,double height) {
		double bmi = weight / (height * height);
		return bmi;

	}

}

```

SceneBuilderの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/50a6cda5-2f77-a541-95e5-29a4faa5774e.png)

# 動作結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/d022d469-b15d-b736-03f9-64957890bc23.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/e74aec74-dfd1-a053-387b-337a3cb09340.png)


# 参考サイト
https://nompor.com/2019/01/26/post-4978/
https://java.keicode.com/lib/javafx-scene-builder.php
http://pineplanter.moo.jp/non-it-salaryman/2017/04/29/javafx-scene-builder/
http://nobotta.dazoo.ne.jp/blog/?p=1335
https://www.relife-campus.com/%E3%80%90javafx%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%91bmi%E8%A8%88%E7%AE%97%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90/
https://stackoverflow.com/questions/27079062/javafx-event-argument-type-mismatch
https://totomo.net/11300-javafxcontrol.htm
https://qiita.com/opengl-8080/items/51bef25aa05ecd929a3d