JavaRush /Blog Java /Random-FR /Introduction à JavaFX

Introduction à JavaFX

Publié dans le groupe Random-FR
Un jour, j'ai eu l'idée d'écrire une petite application de bureau pour mes besoins - quelque chose comme un petit dictionnaire pour apprendre des mots étrangers - et j'ai commencé à me creuser la tête, comment pourrais-je faire ça ? Naturellement, la première chose qui m’est venue à l’esprit était Swing. Tout le monde a probablement entendu parler de Swing . Il s'agit d'une bibliothèque permettant de créer des interfaces graphiques utilisateur. Du fait que notre bien-aimé Oracle n'a pas encore complètement abandonné Swing, il n'est pas considéré comme obsolète et des applications fonctionnent toujours dessus. Cependant, il n'est plus modernisé par Swing, et les gens d'Oracle nous ont donné un avant-goût de ce qu'est l'avenir de JavaFX. Et en fait, JavaFX utilise les composants Swing comme fournisseur de services)

Qu’est-ce que JavaFX ?

JavaFX est essentiellement une boîte à outils GUI pour Java. Il y aura une petite digression ici, et nous rappellerons ce qu'est une GUI : Interface utilisateur graphique - une interface utilisateur graphique est un type d'interface utilisateur dans laquelle tous les éléments (boutons, menus, icônes, listes) présentés à l'utilisateur sur le les affichages se font sous forme d'images, de graphiques. Contrairement à une interface de ligne de commande, dans une interface graphique, l'utilisateur dispose d'un accès aléatoire aux objets visibles à l'aide de périphériques d'entrée. Souvent, les éléments d’interface sont implémentés sous forme de métaphores et affichent leurs propriétés et leur objectif pour faciliter la compréhension de l’utilisateur. JavaFX vise à créer des jeux et des applications de bureau en Java. En fait, il remplacera Swing grâce au nouvel outil GUI proposé pour Java. Cela nous permet également de styliser les fichiers de mise en page GUI (XML) et de les rendre plus élégants en utilisant CSS, similaire à ce à quoi nous sommes habitués dans les applications Web. JavaFX gère en outre les graphiques 3D intégrés ainsi que les applications audio, vidéo et réseau intégrées dans une seule boîte à outils GUI... Il est facile à apprendre et bien optimisé. Il prend en charge de nombreux systèmes d'exploitation, ainsi que les systèmes Windows, UNIX et Mac OS. Introduction à Java FX - 3

Fonctionnalités JavaFX :

  • JavaFX est initialement livré avec un large ensemble d'éléments d'interface graphique, tels que toutes sortes de boutons, champs de texte, tableaux, arbres, menus, graphiques, etc., ce qui nous fera gagner beaucoup de temps.
  • JavaFX utilise souvent des styles CSS, et nous pourrons utiliser un format FXML spécial pour créer l'interface graphique, plutôt que de le faire en code Java. Cela facilite la mise en page rapide d'une interface graphique ou la modification de l'apparence ou de la composition sans avoir à jouer longtemps avec le code Java.
  • JavaFX propose des parties de diagramme prêtes à l'emploi, nous n'avons donc pas besoin de les écrire à partir de zéro chaque fois que vous avez besoin d'un diagramme de base.
  • JavaFX est également livré avec un support graphique 3D, ce qui est souvent utile si nous développons un type de jeu ou des applications similaires.
Jetons un petit coup d'œil aux principaux composants de notre fenêtre :
  • La scène est essentiellement une fenêtre environnante qui agit comme un canevas de départ et contient le reste des composants. Une application peut comporter plusieurs étapes, mais dans tous les cas, il doit y avoir un seul de ces composants. Essentiellement, Stage est le conteneur principal et le point d’entrée.
  • Scène - affiche le contenu de la scène (comme une poupée gigogne). Chaque étape peut contenir plusieurs composants - scènes, qui peuvent être commutés entre eux. En interne, ceci est implémenté par un graphe d'objets appelé Scene Graph (où chaque élément est un nœud, également appelé Node ).
  • Les nœuds sont des contrôles, tels que des boutons d'étiquette, ou même des présentations, qui peuvent contenir plusieurs composants imbriqués. Chaque scène peut avoir un nœud imbriqué, mais il peut s'agir d'une mise en page comportant plusieurs composants. L'imbrication peut être multiniveau, avec des mises en page contenant d'autres mises en page et des composants réguliers. Chacun de ces nœuds possède son propre identifiant, son style, ses effets, son état et ses propres gestionnaires d'événements.
Introduction à Java FX - 4 Passons donc un peu au code. Depuis que j'utilise Java 8, je n'ai pas besoin de créer de dépendances, puisque JavaFx est dans le JDK par défaut (comme dans Java 9.10), mais si nous avons Java 11+, nous devons alors accéder au référentiel maven et tirez-le de là dépendances.

JavaFX : exemples d'utilisation

Nous créons une classe régulière avec une méthode main(point d'entrée) :
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Ici notre classe hérite de javafx.application.Application(ce que nous avons de la boite Bugaga). En principal, nous appelons la méthode Application statique launch()pour lancer notre fenêtre. De plus, notre idée se plaindra de ne pas avoir implémenté la méthode Application, startce que nous faisons finalement. Pourquoi est-ce? Et afin de pouvoir gérer les propriétés (la fonctionnalité de notre fenêtre). Pour ce faire, on utilise un argument entrant primaryStagesur lequel on appelle une méthode showafin de voir la fenêtre se lancer dans main. Complétons un peu notre méthode start:
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Dogs application");
    primaryStage.setWidth(500);
    primaryStage.setHeight(400);

    InputStream iconStream =
    getClass().getResourceAsStream("/images/someImage.png");
    Image image = new Image(iconStream);
    primaryStage.getIcons().add(image);

    Button button = new Button("WOF WOF ???'");

    button.setOnAction(e -< {
      Alert alert = new Alert(Alert.AlertType.INFORMATION, "WOF WOF WOF!!!");
        alert.showAndWait();
    });
    Scene primaryScene = new Scene(button);
    primaryStage.setScene(primaryScene);

    primaryStage.show();
}
Alors que voit-on ici ? Parcourons-le ligne par ligne : 2 - définir le nom de la fenêtre elle-même (stage) 3.4 - définir ses dimensions 6.7 - définir le chemin du flux de lecture vers le fichier (icône) Introduction à Java FX - 58 - créer le fichier en tant qu'objet Image, qui est connecté au fichier réel par le flux passé dans le constructeur 9 - définir une icône dans le panneau supérieur de la fenêtre 11 - créer un objet bouton 13-16 - définir la réaction lorsque le bouton est enfoncé 17 - créer une scène où on place notre bouton 18 - on place la scène sur notre fenêtre commune 20 - on règle le drapeau de visibilité de la fenêtre Et du coup on obtient une petite fenêtre pour accueillir nos pesels préférés : Introduction à Java FX - 6Tout a l'air bien plus simple que Swing, n'est-ce pas ? Mais ce n'est pas encore fini. Il n'est pas bon d'écrire tout le code pour afficher une application, il faut le diviser d'une manière ou d'une autre pour le rendre plus compréhensible (composants graphiques dans un panier, logique dans un autre). Et ici, XML entre en scène... Oh mon dieu, XML ? Exactement. Plus précisément, nous utilisons son implémentation spécifique pour JavaFX - FXML, dans laquelle nous définissons les composants graphiques de l'application et leurs propriétés (toutes sortes de tailles, etc.), puis la connectons à un contrôleur, qui aide à gérer la logique. Regardons un exemple de ce XML :
<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx"  xmlns:fx="http://javafx.com/fxml"
   id="Dogs application" prefHeight="200" prefWidth="300" alignment="center">

  <Label text="Wow wow?"/>

  <Button fx:id="mainButton" text="Greeting" onAction="buttonClicked()"/>

    <fx:script>
       function buttonClicked() {
            mainButton.setText("Wow wow wow!!!")
       }
    </fx:script>
</VBox>
2 - le langage de script que nous utilisons 4-6 - les données importées 8-9 Vbox - un conteneur qui place les sous-composants sur une seule ligne. 11 - afficher du texte 13 - un bouton, lorsque vous cliquez dessus, nous utilisons la méthode décrite dans le script aux lignes 15 à 18. Il devrait y avoir du code pour appeler ce fichier XML dans la méthode start, mais maintenant ce n'est plus si important, et nous je l'omettreai (vous trouverez ci-dessous un exemple d'extraction de ce fichier). Donc, bien sûr, XML est bon (mais pas très bon), les écrire manuellement est très déroutant, n'est-ce pas le siècle dernier ? Introduction à Java FX - 7

Présentation de JavaFX SceneBuilder

C'est à ce stade que (roulements de tambour) entre en jeu - SceneBuilder Dans JavaFX Scene Builder est un outil avec lequel nous pouvons concevoir nos fenêtres sous la forme d'une interface graphique puis les enregistrer, et ce programme, en fonction du résultat, construire des fichiers XML que nous allons améliorer dans notre application. L'interface de ce constructeur fmxl ressemble à ceci : Introduction à Java FX - 8

Une petite parenthèse. Cours JavaFX

Je sauterai les détails de l'installation, ainsi qu'une étude détaillée de cet outil. Ce sont des sujets qui méritent d’être approfondis. Par conséquent, je laisserai quand même quelques liens intéressants vers les leçons JavaFX : un (un tutoriel en ligne sur JavaFX) et deux (un autre bon tutoriel). Passons en revue un petit exemple que j'ai esquissé. Au final j'ai eu quelque chose comme : Introduction à Java FX - 9
(un peu comme une fenêtre pour enregistrer les chiens)
Lorsque vous sélectionnez un chien et appuyez sur le bouton Supprimer, le chien est supprimé de notre liste. Lorsque vous sélectionnez un compagnon à quatre pattes et modifiez ses champs, et après avoir appuyé sur le bouton Modifier, les informations du chien sont mises à jour. Lorsque nous appuyons sur le bouton Nouveau, une fenêtre apparaît pour créer un enregistrement pour un nouveau chien (en commençant par son nom) : Introduction à Java FX-10Cliquez ensuite sur Enregistrer et remplissez le reste de ses champs dans la première fenêtre, puis cliquez sur le bouton Modifier pour sauvegarder. Cela semble facile, non ? Voyons à quoi cela ressemblera dans notre application Java. Pour commencer, je vais juste laisser ici les layouts XML de ces deux fenêtres générées dans SceneBuilder: First (basic) :
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.BaseController">
   <children>
      <SplitPane dividerPositions="0.29797979797979796" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <TableView fx:id="dogs" layoutX="-2.0" layoutY="-4.0" prefHeight="307.0" prefWidth="190.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="-2.0" AnchorPane.rightAnchor="-13.0" AnchorPane.topAnchor="-4.0">
                    <columns>
                      <TableColumn fx:id="nameList" prefWidth="100.33334350585938" text="Nickname" />
                    </columns>
                     <columnResizePolicy>
                        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TableView>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <Label layoutX="49.0" layoutY="25.0" text="Person Details" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" />
                  <GridPane accessibleText="erreererer" gridLinesVisible="true" layoutX="5.0" layoutY="31.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="31.0">
                    <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Label prefHeight="17.0" prefWidth="70.0" text="Nickname" />
                        <Label text="Breed" GridPane.rowIndex="1" />
                        <Label text="Age" GridPane.rowIndex="2" />
                        <Label text="City" GridPane.rowIndex="3" />
                        <Label text="Level of training" GridPane.rowIndex="4" />
                        <TextField fx:id="breed" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                        <TextField fx:id="age" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                        <TextField fx:id="city" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                        <TextField fx:id="levelOfTraining" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                        <TextField fx:id="name" GridPane.columnIndex="1" />
                     </children>
                  </GridPane>
                  <Button layoutX="251.0" layoutY="259.0" mnemonicParsing="false" onAction="#create" text="New" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="230.0" AnchorPane.rightAnchor="130.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="316.0" layoutY="262.0" mnemonicParsing="false" onAction="#edit" text="Edit" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="290.0" AnchorPane.rightAnchor="70.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="360.0" layoutY="262.0" mnemonicParsing="false" onAction="#delete" text="Delete" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="350.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="260.0" />
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>
Deuxièmement (pour créer de nouveaux toutous) :
<?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.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.NewDogController">
   <children>
      <GridPane layoutX="31.0" layoutY="25.0" prefHeight="122.0" prefWidth="412.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="185.0" minWidth="10.0" prefWidth="149.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="173.0" minWidth="10.0" prefWidth="146.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label prefHeight="48.0" prefWidth="178.0" text="Please, write name:">
               <font>
                  <Font size="20.0" />
               </font>
            </Label>
            <TextField fx:id="nickName" prefHeight="36.0" prefWidth="173.0" GridPane.columnIndex="1" />
         </children>
      </GridPane>
      <Button layoutX="222.0" layoutY="149.0" mnemonicParsing="false" onAction="#ok" prefHeight="37.0" prefWidth="95.0" text="Save" />
      <Button layoutX="325.0" layoutY="149.0" mnemonicParsing="false" onAction="#cansel" prefHeight="37.0" prefWidth="95.0" text="Cansel" />
   </children>
</AnchorPane>
À quoi ressemble la structure des dossiers : Introduction à Java FX - 11Comme vous pouvez le voir, il n'y a rien de spécial, il y a des contrôleurs qui représentent certaines fenêtres, il y a des modèles qui représentent nos données. Jetons un coup d'œil à la classe qui lance l'application (implémentation de l'application) : @Data
public class AppFX extends Application {

    private Stage primaryStage;
    private AnchorPane rootLayout;
    private ObservableList listDog = FXCollections.observableArrayList();

    public AppFX() {
        listDog.add(new Dog("Fluffy", "Pug", 8, "Odessa", 2));
        listDog.add(new Dog("Archie", "Poodle", 3, "Lviv", 6));
        listDog.add(new Dog("Willie", "Bulldog", 5, "Kiev", 4));
        listDog.add(new Dog("Hector", "Shepherd", 9, "Minsk", 6));
        listDog.add(new Dog("Duncan", "Dachshund", 1, "Hogwarts", 9));
    }
Ici, nous voyons un constructeur qui remplira nos données initiales (que nous stockons dans une feuille spéciale - ObservableList).
public static void main(String[] args) {
        Application.launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Dogs application");
        showBaseWindow();
}
Rien de spécial - mainet l'implémentation start()qui lance l'application :
public void showBaseWindow() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/rootWindow.fxml"));
            rootLayout = loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            InputStream iconStream = getClass().getResourceAsStream("/icons/someImage.png");
            Image image = new Image(iconStream);
            primaryStage.getIcons().add(image);
            BaseController controller = loader.getController();
            controller.setAppFX(this);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Nous voyons donc ici la méthode que nous lançons réellement dans start(), à savoir celle qui définit les paramètres de notre fenêtre de base. Comme dans la disposition XML dans les ressources : lui donner une icône, le lier à un contrôleur spécifique et donner au contrôleur un lien vers thisla classe)
public void showCreateWindow(Dog dog) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/new.fxml"));
            AnchorPane page = loader.load();
            Stage dialogStage = new Stage();
            dialogStage.setTitle("Wow Wow Wow");
            dialogStage.initModality(Modality.WINDOW_MODAL);
            dialogStage.initOwner(primaryStage);
            dialogStage.setScene(new Scene(page));
            CreateController controller = loader.getController();
            controller.setDialogStage(dialogStage);
            controller.setDog(dog);
            dialogStage.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Nous voyons ici la méthode responsable de l'apparition de la deuxième fenêtre - la fenêtre de création d'un nouvel enregistrement (le nom d'un nouveau chien). Nous définissons également le contrôleur, la mise en page XML, la scène, etc... La prochaine classe que nous considérerons sera un modèle représentant notre chien (informations à ce sujet) : @Data
public class Dog {

    private StringProperty name;
    private StringProperty breed;
    private IntegerProperty age;
    private StringProperty city;
    private IntegerProperty levelOfTraining;

    public Dog(String name, String breed, int age, String city, int levelOfTraining) {
        this.name = new SimpleStringProperty(name);
        this.breed = new SimpleStringProperty(breed);
        this.age = new SimpleIntegerProperty(age);
        this.city = new SimpleStringProperty(city);
        this.levelOfTraining = new SimpleIntegerProperty(levelOfTraining);
    }

    public Dog() {
        name = new SimpleStringProperty();
        breed = null;
        age = null;
        city = null;
        levelOfTraining = null;
    }
}
Ici, nous voyons deux constructeurs. L'un est presque normal avec tous les arguments (presque, parce que nous utilisons des wrappers FX spéciaux de types simples) et un constructeur sans arguments : nous l'utilisons lors de la création d'un nouveau chien, qui n'a d'abord qu'un nom. Contrôleur pour la fenêtre de base : @Data
public class BaseController {

    @FXML
    private TableView dogs;
    @FXML
    private TableColumn nameList;
    @FXML
    private TextField name;
    @FXML
    private TextField breed;
    @FXML
    private TextField age;
    @FXML
    private TextField city;
    @FXML
    private TextField levelOfTraining;
    private AppFX appFX;
Ici, nous voyons nos champs d'objet, mais au format TextField. Il s'agit d'un format qui représente un champ de saisie de texte. @FXML est une annotation conçue pour lier le code Java et l'objet correspondant de notre mise en page (bouton, champ ou autre).
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Nous voyons ici une méthode d'affichage des noms de chiens, à droite dans la liste (son annotation @FXML est liée au composant de mise en page JavaFX TableView).
public void setAppFX(AppFX appFX) {
    this.appFX = appFX;
    dogs.setItems(appFX.getListDog());
}

private void showDogsInformation(Dog dog) {
    if (dog != null) {
        name.setText(dog.getName() != null ? dog.getName().getValue() : null);
        breed.setText(dog.getBreed() != null ? dog.getBreed().getValue() : null);
        age.setText(dog.getAge() != null ? String.valueOf(dog.getAge().get()) : null);
        city.setText(dog.getCity() != null ? dog.getCity().getValue() : null);
        levelOfTraining.setText(dog.getLevelOfTraining() != null ? String.valueOf(dog.getLevelOfTraining().get()) : null);
    } else {
        name.setText("");
        breed.setText("");
        age.setText("");
        city.setText("");
        levelOfTraining.setText("");
    }
}
Dans la première méthode, nous voyons définir une référence interne à la classe qui implémente Application (afin que nous puissions appeler sa méthode pour appeler la deuxième fenêtre), et définir la liste initiale à afficher. La seconde vérifie si le chien actuel possède certaines données et, sur cette base, définit les champs de texte :
@FXML
    private void delete() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().remove(selectedIndex);
    }

    @FXML
    private void edit() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().set(selectedIndex, new Dog(name.getText(), breed.getText(), Integer.valueOf(age.getText()), city.getText(), Integer.valueOf(levelOfTraining.getText())));
    }

    @FXML
    private void create() {
        Dog someDog = new Dog();
        appFX.showCreateWindow(someDog);
        if (someDog.getName() != null && !someDog.getName().getValue().isEmpty()) {
            appFX.getListDog().add(someDog);
        }
    }
}
Nous voyons ici trois méthodes de la fenêtre de base associées aux boutons : Introduction à Java FX - 12
  • delete — supprime le chien sélectionné (sélectionné) par index ;
  • modifier - créer un nouveau chien avec les données transférées et le définir à la place de celui qui était auparavant ;
  • create - nous créons un nouveau chien et appelons la méthode d'appel de la fenêtre de création, en passant un nouvel objet, et après la fermeture, si le nom n'est pas nul, nous enregistrons le nouvel animal.
Passons au contrôleur de fenêtre pour créer le chien : @Data
public class CreateController {
    private Stage dialogStage;
    private Dog dog;

    @FXML
    private TextField nickName;

    @FXML
    private void ok() {
        if (nickName != null && !nickName.getText().isEmpty()) {
            dog.setName(new SimpleStringProperty(nickName.getText()));
            dialogStage.close();
        }
    }

    @FXML
    private void cansel() {
        dialogStage.close();
    }
}
Ici, nous voyons la connexion avec le champ de texte dans la fenêtre, traitant les boutons Enregistrer et Annuler, qui ferment d'une manière ou d'une autre la fenêtre. Comme vous pouvez le constater, pour plus de commodité dans ma petite application, j'ai utilisé Lombok, sinon le code aurait beaucoup grandi et je ne l'aurais pas intégré dans ma révision. C'est probablement tout ce que j'ai pour aujourd'hui. Aujourd'hui, nous nous sommes brièvement familiarisés avec les concepts de base et un exemple d'utilisation de JavaFX, et nous pouvons créer de petites applications de bureau (en utilisant des informations supplémentaires, qui, heureusement, sont abondantes sur Internet). Et vous, à votre tour, aimez))
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION