Premiers pas avec JavaFX avec une application qui peut calculer la teneur en alcool lorsque le zéro fort est divisé par une bouchée

Cet article est l'article du 5ème jour du Calendrier de l'Avent Mikatus 2019.

introduction

Aimez-vous l'alcool? J'adore l'alcool et __peut-être que l'alcool m'aime aussi __ [^ 1]. [^ 1]: Il y a une possibilité d'amour non partagé.    Récemment, divers chu-hi en conserve ont été libérés, et dès que je rentre à la maison tous les jours, je bois un verre, et si je bois juste, je m'endors.

Cependant, le nombre de highs à mâcher en conserve ces jours-ci a augmenté de 9% ou plus, y compris __ un certain __ fort. J'ai tendance à acheter quelque chose à forte teneur en alcool, mais quand je pense aux risques pour la santé, je tremble et je ne peux pas dormir sans boire __.

Dans de telles circonstances, j'ai été impressionné par l'idée que mes collègues de travail disaient __ "Ce n'est pas grave si vous le divisez par un petit peu" [^ 2] __, et quelle est la teneur en alcool lorsque vous divisez l'alcool avec l'alcool? ?? J'ai donc créé une application de bureau avec JavaFX pour calculer.

[^ 2]: Je ne sais pas ce qui va bien.

Qu'est-ce que JavaFX

Cité de Wikipedia ci-dessous

JavaFX est une bibliothèque d'interface graphique pour les applications Internet riches (RIA) qui s'exécute sur des machines virtuelles Java. Il est installé en standard dans Java SE 7 Update 2 ou version ultérieure. Contrairement à Swing, la conception est décrite en utilisant à la fois XML et CSS appelés FXML.

En gros, cela ressemble à un successeur de Swing. Swing a dû écrire toute l'interface utilisateur en Java, ce qui était assez infernal, mais en JavaFX, la conception a été extraite dans un fichier appelé FXML, il semble donc que l'interface utilisateur ne soit pas écrite en Java.

Construction de l'environnement et création de projets

J'ai fait référence à cet article. [Pour les super débutants] Super introduction JavaFX La description de la structure du projet et de la classe principale a été entièrement copiée.

Scene Builder est assez pratique et la construction de l'interface utilisateur se termine par glisser-déposer des pièces. スクリーンショット 2019-11-25 20.07.49.png C'est comme ça.

Une mise en garde est que Java SE 11 n'est plus la version gratuite d'Oracle JDK et que la plupart des gens utilisent OpenJDK, mais __OpenJDK n'inclut pas JavaFX __. Cette fois, c'était un problème à gérer, j'ai donc choisi Java 8 lors de la création d'un projet dans Eclipse.

Soit dit en passant, il semble y avoir un moyen d'y faire face. Exécutez JavaFX avec OpenJFX + OpenJDK [Présentation de JavaFX à OpenJDK 11] (https://blogs.osdn.jp/2018/11/12/merge-openjfx.html)

Associer FXML au contrôleur

Lorsque vous créez une interface utilisateur avec Scene Builder et que vous l'enregistrez, elle est enregistrée en tant que fichier FXML. Cliquez ici pour le fichier FXML créé cette fois

Sans titre.fxml


<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TextField layoutX="69.0" layoutY="98.0" />
      <TextField layoutX="300.0" layoutY="98.0" />
      <TextField layoutX="69.0" layoutY="201.0" />
      <TextField layoutX="300.0" layoutY="201.0" />
      <Button layoutX="503.0" layoutY="201.0" mnemonicParsing="false" text="calculer" />
      <Label layoutX="33.0" layoutY="103.0" text="1." />
      <Label layoutX="33.0" layoutY="206.0" text="2." />
      <Label layoutX="240.0" layoutY="103.0" text="ml" />
      <Label layoutX="240.0" layoutY="206.0" text="ml" />
      <Label layoutX="471.0" layoutY="103.0" text="\%" />
      <Label layoutX="471.0" layoutY="206.0" text="\%" />
      <Label layoutX="100.0" layoutY="285.0" prefHeight="48.0" prefWidth="401.0" />
   </children>
</Pane>

Ce que je veux vraiment faire, c'est que lorsque le bouton pour calculer est enfoncé, les valeurs entrées dans les quatre formulaires sont acquises et calculées, de sorte que la pression sur le bouton et les valeurs entrées dans les quatre formulaires soient utilisées comme contrôleur Java. Nous allons modifier le fichier fxml pour qu'il puisse être accepté par la classe.

Et voici le produit fini

Main.fxml


<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.AlcoholController">
   <children>
      <TextField layoutX="69.0" layoutY="98.0" fx:id="amountFst" />
      <TextField layoutX="300.0" layoutY="98.0" fx:id="alcoholFst" />
      <TextField layoutX="69.0" layoutY="201.0" fx:id="amountSec" />
      <TextField layoutX="300.0" layoutY="201.0" fx:id="alcoholSec" />
      <Button layoutX="503.0" layoutY="201.0" mnemonicParsing="false" text="calculer" fx:id="button" onAction="#onClick" />
      <Label layoutX="33.0" layoutY="103.0" text="1." />
      <Label layoutX="33.0" layoutY="206.0" text="2." />
      <Label layoutX="240.0" layoutY="103.0" text="ml" />
      <Label layoutX="240.0" layoutY="206.0" text="ml" />
      <Label layoutX="471.0" layoutY="103.0" text="\%" />
      <Label layoutX="471.0" layoutY="206.0" text="\%" />
      <Label layoutX="100.0" layoutY="285.0" prefHeight="48.0" prefWidth="401.0" fx:id="result" />
   </children>
</Pane>

Vous pouvez voir que les balises commençant par «fx:» ont été ajoutées. Tout d'abord, décrivez le contrôleur associé au fichier FXML avec fx: controller dans la partie description du plus grand panneau. TextField recevra «fx: id». Celui-ci sera ultérieurement associé à la variable Controller. Pour Button, définissez ʻonClick avec ʻonAction. Maintenant, lorsque le bouton est enfoncé, une méthode appelée onClick devrait commencer à fonctionner.

Créez un contrôleur selon le FXML ci-dessus.

AlcoholController.java


package controller;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class AlcoholController implements Initializable {

	@FXML
	private TextField amountFst;

	@FXML
	private TextField alcoholFst;

	@FXML
	private TextField amountSec;

	@FXML
	private TextField alcoholSec;

	@FXML
	private Button button;

	@FXML
	private Label result;

	@Override
	public void initialize(URL location, ResourceBundle resources) {

	}

	@FXML
	public void onClick(ActionEvent event) {

	}

}

C'est comme ça. En ajoutant @ FXML, il semble être lié au fichier FXML défini précédemment.

Après cela, écrivez un calcul simple sur onClick et c'est terminé. スクリーンショット 2019-11-25 20.27.26.png Il s'agit de la teneur en alcool quand une longue canette de 9% d'alcool est divisée par une bouchée. Vous pouvez voir que c'est un nombre très sain __.

Après cela, si vous l'exportez avec un fichier exécutable d'Eclipse, ce sera une excellente application.

finalement

J'ai écrit Swing, mais c'était beaucoup plus facile que Swing car Scene Builder était assez pratique. Le code Java lui-même est rafraîchissant et facile à lire, et je pourrais le lire même si je sautais pendant quelques jours et que les jours étaient vides.

La source que j'ai écrite cette fois est publiée sur Github, veuillez donc vous y référer si vous le souhaitez. https://github.com/SomeyaHotaka/AlcoholCalc

Avec cette application, je veux mener une vie saine. À la prochaine.

Recommended Posts

Premiers pas avec JavaFX avec une application qui peut calculer la teneur en alcool lorsque le zéro fort est divisé par une bouchée
Java learning_Behavior lorsqu'il y a un champ avec le même nom et une méthode avec le même nom dans deux classes dans une relation d'héritage