JavaFX et sauvegarde Partie 1

Didacticiel sur la persistance

JavaFX et sauvegarde Partie 1
Sommaire

Sauvegardons des données en Json

Plusieurs bibliothèques existent pour exploiter le Json avec Java. Je vous propose d’en essayer 2. Nous utiliserons Json.simple et Jackson. La première est très simple d’utilisation comme son nom l’indique et la deuxième nous donnera plus d’outils pour la gestion de nos objets. Je prend le partie de vous montrer l’application de ces outils avec JavaFX car le bind sera particulier dans ce cas.

Commençons par l’interface graphique

Créez un projet dans l’IDE de votre choix. J’utiliserai IntelliJ mais les manipulations sont les mêmes dans Netbeans.

Le projet est un projet maven suivant l’archetype (javafx-archetype-fxml) habituel maintenant:

  • Supprimez les fichiers inutiles: App.java, PrimaryController.java,SecondaryController.java, primary.fxml et secondary.fxml.
  • Créez la JavaFX application App.java.
public class App extends Application {

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

    @Override
    public void start(Stage primaryStage) {

    }
}
  • Créez notre layout de test que nous allons nommer exemple.fxml

Dans IntelliJ: clique droit sur resources → FXML File puis quand le fichier est créé, le nom du contrôleur est en rouge. IntelliJ vous propose de le créer pour vous. Choisissez bien le package principal.

Votre projet devrait avoir l’arborescence suivante.

.
├── java
│   ├── org
│   │   └── afpa
│   │       ├── App.java
│   │       └── Exemplejson.java
│   └── module-info.java
└── resources
    └── org
        └── afpa
            └── exemplejson.fxml

Pour le fxml, nous allons simplement ajouter un bouton et des label.

layout1

J’ai utilisé un BorderPan et des Box

arbo

Nommez les 3 label afin de les récupérer dans notre appli (labelNom, labelPrenom, labelAge). Et ajoutez une méthode au bouton que nous appelons sauvBut.

si vous utilisez les automatismes de IntelliJ vos label seront déclarés comme ceci public Label labelNom;. Je vais les lier avec l’annotation @FXML et les rendre private pour respecter le fxml et l’encapsulation.

@FXML
private Label labelNom;
@FXML
private Label labelPrenom;
@FXML
private Label labelAge;
@FXML
private Button sauvBut;

@FXML
private void sauvHandler(ActionEvent event) {
  // Nous allons ajouter notre code ici
    }

Créons un objet Client prévu pour JavaFX

Créez une classe Client.java dans notre package principale. Comme nous travaillons avec JavaFX, il est plus intéressant d’utiliser des Properties.

private StringProperty nom;
private StringProperty prenom;
private IntegerProperty age;

Ces objets sont utilisés par JavaFX pour le rechargement automatique de l’affichage. Cependant nos Getter et Setter seront un peu différents de d’habitude. Heureusement pour nous IntelliJ va très bien s’adapter (alt inser pour windows cmd N pour mac) et Getter and Setter. Voilà le fichier que devriez obtenir.

package org.afpa;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.StringProperty;

public class Client {

    private StringProperty nom;
    private StringProperty prenom;
    private IntegerProperty age;

    public String getNom() {
        return nom.get();
    }

    public StringProperty nomProperty() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom.set(nom);
    }

    public String getPrenom() {
        return prenom.get();
    }

    public StringProperty prenomProperty() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom.set(prenom);
    }

    public int getAge() {
        return age.get();
    }

    public IntegerProperty ageProperty() {
        return age;
    }

    public void setAge(int age) {
        this.age.set(age);
    }
}

Je vais m’attarder un peu sur ce code pour vous expliquer ce qu’a fait IntelliJ pour nous:

  • Tout d’abord, Les Getter, par exemple getNom() va chercher la StringProperty nom et utilise la méthode get() pour la transformer en String.
  • Pour les Setter, même histoire dans l’autre sens. setNom() prend une String en paramètre, va chercher la StrinProperty nom et avec la methode set() va transformer cette String en StringProperty.
  • Enfin, il y a les méthodes comme nomProperty() qui assure le lien avec JavaFX.

Il nous faut aussi un constructeur:

public Client(String nom, String prenom, Integer age) {
        this.nom = new SimpleStringProperty(nom);
        this.prenom = new SimpleStringProperty(prenom);
        this.age = new SimpleIntegerProperty(age);
    }

On alimente et on affiche

J’aurais pu faire autrement mais je vais utiliser l’implémentation de l’interface Initializable qui ajoute une méthode initilize à l’appelle du controlleur. Cela donne ceci après création et alimentation des champs:

@Override
    public void initialize(URL location, ResourceBundle resources) {
        Client cli1 = new Client("Paul","Auchon",35);

        labelNom.setText(cli1.getNom());
        labelPrenom.setText(cli1.getPrenom());
        labelAge.setText(String.valueOf(cli1.getAge()));
    }

Maintenant il ne vous reste qu’à lancer l’afficahge de nos préparatifs pour voir si tout fonctionne.

Dans la prochaine partie nous verrons comment sauvegarder notre objet dans un json.