経緯
以前JavaScriptでも作成したBMI計算アプリをJavaFXでも作成することにした。
環境構築
①eclipseマーケットプレイスからプラグイン(e(fx)clipse)のインストール
②OpenJFXのインストール
⇒Javaのビルドパスにてライブラリの追加が必要。
⇒libフォルダ内のsrc.zip以外すべてのjar
③Scene Builderのインストール
ディレクトリ構成
ソースコード
Main.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 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
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;
}
}
動作結果
参考サイト
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