Bonjour à vous

Depuis plusieurs jours, je cherche une solution pour faire la liaison entre ma TableView et mes TextField (qui servent à éditer ma TableView)

Le principe :
Les données (Personne) sont lues en JPA depuis une DB (PersonneDAO). Ce sont des simples POJO. Ces données sont affichées dans une TableView.
Je voudrais que lorsqu'on sélectionne une ligne dans la TableView, les TextField se remplissent avec les données de la TableView et lorsque l'on modifier le contenu des TextField, la ligne sélectionnée de la TableView soit modifiée directement.

J'ai chercher des exemples via google afin de mieux comprendre le mécanisme du binding mais rien ne m'a permis de trouver une solution. J'ai tenté de me baser sur le site http://ugate.wordpress.com/2012/07/3...ings-part-iii/ mais rien à faire.

Voici mes sources :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import jfxtras.labs.scene.control.BeanPathAdapter;
 
import java.util.ArrayList;
import java.util.List;
 
public class TestAppl extends Application {
 
  private TableView<Personne> tv;
  private TextField tfNom;
  private TextField tfPrenom;
  private ObservableList<Personne> personnes;
 
  private Personne p = new Personne();
  private BeanPathAdapter<Personne> personPA = new BeanPathAdapter<>(p);
 
  @Override
  public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Test de TableView");
 
    Scene scene = new Scene(new BorderPane(), 800, 500);
    primaryStage.setScene(scene);
 
    PersonneDAO personneDAO = new PersonneDAO();
 
    HBox pan = new HBox();
    pan.setPadding(new Insets(10, 10, 10, 10));
    pan.setSpacing(5);
    tfNom = new TextField();
    tfPrenom = new TextField();
 
    pan.getChildren().addAll(tfNom, tfPrenom);
    ((BorderPane) scene.getRoot()).setTop(pan);
 
    tv = new TableView<>();
 
    TableColumn<Personne, String> nomCol = new TableColumn("Nom");
    nomCol.setCellValueFactory(new PropertyValueFactory("nom"));
 
    TableColumn<Personne, String> prenomCol = new TableColumn("Prénom");
    prenomCol.setCellValueFactory(new PropertyValueFactory("prenom"));
 
    tv.getColumns().addAll(nomCol, prenomCol);
 
    personnes = FXCollections.observableArrayList(personneDAO.getPersonnes());
    tv.getItems().addAll(personnes);
 
    tv.setOnMouseClicked(new EventHandler<MouseEvent>() {
      @Override
      public void handle(MouseEvent mouseEvent) {
        if (mouseEvent.getButton().equals(MouseButton.PRIMARY)) {
          if (mouseEvent.getClickCount() == 1) {
            personPA.setBean(tv.getSelectionModel().getSelectedItem());
            personPA.bindBidirectional("nom", tfNom.textProperty());
            personPA.bindBidirectional("prenom", tfPrenom.textProperty());
          }
        }
      }
    });
 
    ((BorderPane) scene.getRoot()).setCenter(tv);
 
    primaryStage.show();
  }
 
  public static void main(String[] args) {
    Application.launch(args);
  }
Le bean Personne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 public class Personne {
    private String nom;
    private String prenom;
 
    public Personne() {
    }
 
    public Personne(String nom, String prenom) {
      this.nom = nom;
      this.prenom = prenom;
    }
 
    public String getNom() {
      return nom;
    }
 
    public void setNom(String nom) {
      this.nom = nom;
    }
 
    public String getPrenom() {
      return prenom;
    }
 
    public void setPrenom(String prenom) {
      this.prenom = prenom;
    }
  }
Et le futur DAO :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 public class PersonneDAO {
 
    public List<Personne> getPersonnes() {
      List<Personne> pers = new ArrayList<>();
      pers.add(new Personne("Nom1", "prenom1"));
      pers.add(new Personne("Nom2", "prenom2"));
      pers.add(new Personne("Nom3", "prenom3"));
      return pers;
    }
  }
Je vous remercie de m'avoir lu et si quelqu'un à une idée ...
Je vous souhaite une bonne journée.

Neo