JavaFX et sauvegarde Partie 1
Didacticiel sur la persistance
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
etsecondary.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.
J’ai utilisé un BorderPan et des Box
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 rendreprivate
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éthodeget()
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 methodeset()
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.