IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

requete SQL jointure, TableView, lambda expressions


Sujet :

JavaFX

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut requete SQL jointure, TableView, lambda expressions
    slt la cpie, tjs moi

    Comment fait on pr, via les expressions lambda, afficher ds 1 TableView le résultat d'1 requete SQL avec jointure?

    J'ai 4 observableList ds ma class (F03_controller.java)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	// contient le retour de test01_()
    	ObservableList<ObservableList<String>> list_;
     
    	// Les 3 suivantes servent ds la methode test01_()
    	// contient les 2 ObservableList qui suivent
    	ObservableList<ObservableList<String>> liste_testGeneral_ = FXCollections.observableArrayList();
     
    	// contient le titre des livres empruntés
    	ObservableList<String> liste_test01_ = FXCollections.observableArrayList();
     
    	// contient le prenom des emprunteurs
    	ObservableList<String> liste_test02_ = FXCollections.observableArrayList();
    La méthode test01_() qui
    - possède et execute la requete SQL
    - remplit liste_test01_ avec le titre des livres empruntés
    - remplit liste_test02_ avec le nom des emprunteurs
    - remplit liste_testGeneral avec les 2 précédentes
    - retourne la liste liste_testGeneral_
    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
    81
    82
    83
    84
     
    public ObservableList<ObservableList<String>> test01_() {
     
    		System.out.println("fichier: F03_emprunt_controller.java");
    		System.out.println("methode: test01_()");
     
    		// les variables
     
    		String selectQuerytest01_;
    		Connection contest01_;
    		PreparedStatement p_stmttest01_;
    		ResultSet rstest01_;
     
    		// redact° de la requete
    		selectQuerytest01_ = "SELECT client.prenom, livre.titre\n"
    				+ "FROM client, livre\n"
    				+ "INNER JOIN emprunt\n"
    				+ "WHERE client.id_abonne = emprunt.id_abonne\n"
    				+ "AND emprunt.id_livre = livre.id_livre";
     
    		// initialisat° de la variable de type Connection
    		// obtenir la connex° grâce à la classe Connexion
    		contest01_ = Connexion.getCon();
     
    		try {
     
    			// initialisat° d'1 variable de type
            	        // PreparedStatement
            	        // prépare la requete
                            p_stmttest01_ = contest01_.prepareStatement(selectQuerytest01_);
     
                           // initialisat° d'1 variable de type
                           // ResultSet
                           // execute la requete
                           rstest01_ = p_stmttest01_.executeQuery();
     
                          while (rstest01_.next()) {
     
                	            // Possible value [livre.titre, titre, client.prenom, prenom]
                               liste_test01_.add(rstest01_.getString("titre"));
                               liste_test02_.add(rstest01_.getString("prenom"));
     
                         }
     
    		} catch(SQLException except) {
     
    			//
    			System.out.println("Except°:");
            	        System.out.println("Fichier: F03_emprunt_controller.java");
            	        System.out.println("Methode: test01_()");
                            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, except);
     
    		}
     
    		System.out.println("Found " + liste_test01_.size() + " livre.titre");
    		System.out.println("Found " + liste_test02_.size() + " client.prenom");
     
     
    		// imprime la ObservableList liste_test01_: les titres
    		for(String empt : liste_test01_) {
         	             System.out.println("-: " + empt);
    		}
     
    		// remplit la ObservableList liste_testGeneral_
    		// avec les 2 autres
    		liste_testGeneral_.add(liste_test01_);
    		liste_testGeneral_.add(liste_test02_);
     
    		// imprime la ObservableList liste_testGeneral
    		for(ObservableList<String> empt : liste_testGeneral_) {
         	               System.out.println("--: " + empt);
    		}
     
    		// permet d'acceder a la 1° ObservableArrayList
    		System.out.println(liste_testGeneral_.get(0));
    		// permet d'acceder a la 2° ObservableArrayList
    		System.out.println(liste_testGeneral_.get(1));
    		// permet d'acceder au 1° elt de la 1° ObservableArrayList
    		System.out.println(liste_testGeneral_.get(0).get(0));
     
    		return liste_testGeneral_;
    	        // return liste_test01_;
     
    	}
    Enfin, ds la méthode initialize(URL p_url, ResourceBundle p_r_bdle)
    j'essaye avec les lamba (que je ne connais pas) d'afficher ds la TableView
    - TV02_col_titre, les titres des livres empruntés
    - TV02_col_prenom, les prénoms des emprunteurs
    J'ai bien differencie les etapes pr "etre sur de mon coup"

    Je n'arrive pas a afficher les 2 informations en meme temps.
    Je n'arrive qu'a afficher que les titres ou que le prenom des emprunteurs ds les colonnes de la TableView
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    @Override
    public void initialize(URL p_url, ResourceBundle p_r_bdle) {
     
     
    	System.out.println("fichier: F03_emprunt_controller");
    	System.out.println("methode: initialize()");	
     
    	// la colonne prenom de la TV02
     
    	// A quoi cela sert il?
    	// TV02.getColumns().setAll(TV02_col_prenom, TV02_col_titre);
     
    	//
    	ObservableList<String> list__01 = FXCollections.observableArrayList();
     
    	// ajout des prenoms
    	list__01.addAll(list_.get(1));
     
    	//
    	System.out.println("Nbre d'elts ds list__01:");
    	System.out.println(list__01.size());
     
    	// contient les titres
    	System.out.println("contenu de list__01");
    	System.out.println(list__01);
     
     
    	//
    	TV02_col_prenom.setCellValueFactory(feature -> {
    	    String value = feature.getValue();
    	    return new SimpleStringProperty(value);
    	});
     
     
    	// la colonne titre de la TV02
     
    	//
    	ObservableList<String> list__02 = FXCollections.observableArrayList();
     
    	// ajout des titres
    	list__02.addAll(list_.get(0));
     
    	//
    	System.out.println("Nbre d'elts ds list__02:");
    	System.out.println(list__02.size());
     
    	// contient les titres
    	System.out.println("contenu de list__02");
    	System.out.println(list__02);
     
    	//
    	TV02_col_titre.setCellValueFactory(feature1 -> {
    	    String value1 = feature1.getValue();
    	    return new SimpleStringProperty(value1);
    	});
     
    	// erreur:
    	// Can not retrieve property 'prenom' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@4a15866a with provided class type: class java.lang.String
            // TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("prenom"));
     
    	// erreur a la syntaxe:
    	// Type mismatch: cannot convert from ObservableList<String> to ObservableValue<String>
    	// TV02_col_prenom.setCellValueFactory(cellData -> (list__01));
     
    	// erreur:
    	// AVERTISSEMENT: Can not retrieve property 'client.prenom' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@4a15866a with provided class type: class java.lang.String
    	// java.lang.IllegalStateException: Cannot read from unreadable property client.prenom
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("client.prenom"));
     
    	// erreur:
    	// AVERTISSEMENT: Can not retrieve property 'id_abonne' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@53779ac3 with provided class type: class java.lang.String
    	// java.lang.IllegalStateException: Cannot read from unreadable property id_abonne
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("id_abonne"));
     
    	// erreur
    	// AVERTISSEMENT: Can not retrieve property 'titre' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@4a15866a with provided class type: class java.lang.String
    	// java.lang.IllegalStateException: Cannot read from unreadable property titre
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("titre"));
     
    	// erreur
    	// AVERTISSEMENT: Can not retrieve property 'C1' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@4d9d6253 with provided class type: class java.lang.String
    	// java.lang.IllegalStateException: Cannot read from unreadable property C1
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("C1"));
     
    	// erreur
    	// AVERTISSEMENT: Can not retrieve property 'C2' in PropertyValueFactory:
    	// javafx.scene.control.cell.PropertyValueFactory@53779ac3 with provided class type: class java.lang.String
    	// java.lang.IllegalStateException: Cannot read from unreadable property C2
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, String>("C2"));
     
    	// erreurs:
    	// la methode n'est pas applicable pr les arguments
    	// constructeur indefini
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<String, ObservableList>(test01_().get(0)));
     
    	// erreurs:
    	// la methode n'est pas applicable pr les arguments
    	// constructeur indefini
    	// TV02_col_prenom.setCellValueFactory(new PropertyValueFactory<ObservableList, String>(test01_().get(0)));
     
    	// erreur: type mismatch
    	// TV02_col_prenom.setCellValueFactory(cellData -> (list__01));
     
    	// erreur
    	//  java.lang.ClassCastException:
    	// class com.sun.javafx.collections.ObservableListWrapper cannot be cast to
    	// class javafx.util.Callback (com.sun.javafx.collections.ObservableListWrapper
    	// and javafx.util.Callback are in module javafx.base@18.0.1 of loader 'app')
    	// TV02_col_prenom.setCellValueFactory((Callback<CellDataFeatures<String, String>, ObservableValue<String>>) list__01);
     
    	// la 2° methode prend le pas sur la 1°
    	TV02.setItems(list__01);
    	TV02.setItems(list__02);
     
    }
    Dc soit
    - y'a qque chose que je ne fais pas
    - y'a qque chose que je fais mal,
    - je n'utilise pas du tout la bonne méthode

    Merci a vous,

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Analyse simple :
    • 1 tache longue absolument pas liée a la GUI ni a JavaFX d'aucune manière, c'est du JDBC et du SQL, aucun rapport avec notre soucis ici : connexion a la BD puis récupération du résultat -> peut être fait en tache de fond totalement indépendante de la GUI.
    • Mettre la jour la GUI -> doit etre fait dans le JavaFX application thread


    Tutoriel :
    * Tache de fond : Tutoriel sur l'exécution d'une tâche de fond en JavaFX by bibi
    * TableView : Tutoriel sur l'API Cell de JavaFX#TableView by bibi again

    Questions sans réponse : pourquoi avoir d'autant de listes observables alors qu'une seule suffit ? -> ObservableList<Result> avec :


    Donc en gros, il faut faire :
    1. créer et initialiser la GUI (Initialize()) et créer une variable membre (ex: queryResult) de la classe de type ObservableList<Result>, initialiser la TableView avec et fournir les bons extracteurs de valeurs pour chaque colonnes.
    2. Créer une méthode qui va initialiser et lancer une tache de fond asynchrone. Cette tache se chargera de se connecter a la BD, de faire la requête et de convertir les valeurs retournées en Result (probablement dans un Result[] ou une List<Result>).
    3. Dans l’écouteur de fin de tache complétée (setOnSucceeded()), mettre toutes les valeurs Result obtenues dans la liste observable queryResult -> paf la table se met a jour, c'est magique.
    4. Penser a gérer les erreurs (setOnFailed()) ou les annulations.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Re,
    Bon alors

    pr le type Result
    il a fallu importer
    le module: javax.xml.transform.Result;

    01
    la variable membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private ObservableList<ObservableList<Result>> queryResult;
    sinon avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private ObservableList<ObservableList> queryResult;
    je ne peux pas executer (eclipse souligne 1 erreur)

    02
    pr TableView
    Une table contient bien une liste d'objets de type V
    dc pr mon cas, type ObservableList
    ms vu qu'il est preferable de parametrer les ObservableList
    j'initialise comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @FXML
    private TableView<ObservableList<Result>> TV03;
    pr les colonnes
    chaque colonne de la table opère sur deux types :
    V qui est le type de l'objet contenu dans la table, c-a-d ObservableList
    T qui est le type de l'objet à afficher dans la colonne.

    dc
    l'objet contenu ds la table sera: ObservableList<Result>
    l'objet a afficher ds la colonne sera: Result
    dc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @FXML
    private TableColumn<ObservableList<Result>, Result> TV03_col_prenom;
     
    @FXML
    private TableColumn<ObservableList<Result>, Result> TV03_col_titre;
    03 pr initialiser la TableView
    ds la methode initialize()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TV03.setItems(queryResult)
    pr le moment, "AUCUN contenu a afficher" >> normal

    -----------------------------------------------------------

    pr le thread

    Y'a un gros... "truc" sur ton tutoriel
    II-C. Solution
    L52 à 87 ms je ne suis pas arrivé à le reproduire

    Me suis tourné vers la FAQ:
    http://<br /> https://java.developp...-de-fond<br />
    Comment creer 1 tâche de fond

    que j'ai transformé en:
    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
     
    public void test03_() {
       final Service<ObservableList<Result>> service = new Service<ObservableList<Result>>() { 
     
          @Override 
          protected Task<ObservableList<Result>> createTask() { 
             return new Task<ObservableList<Result>>() { 
     
            @Override 
             protected ObservableList<Result> call() throws Exception { 
     
                // les variables
                ObservableList<String> obList01Test03_ = FXCollections.observableArrayList();
                String selectQueryTest03_;
                Connection conTest03_;
                PreparedStatement p_stmtTest03_;
                ResultSet rsTest03_;
     
                // redact° de la requete
                selectQueryTest03_ = "SELECT client.prenom, livre.titre\n"
                	+ "FROM client, livre\n"
                	+ "INNER JOIN emprunt\n"
                	+ "WHERE client.id_abonne = emprunt.id_abonne\n"
                	+ "AND emprunt.id_livre = livre.id_livre";
     
                // initialisat° de la variable de type Connection
                // obtenir la connex° grâce à la classe Connexion
                conTest03_ = Connexion.getCon();
     
                //
                try {
     
                   // initialisat° de la variable de type
                   // PreparedStatement
                   // prépare la requete
                   p_stmtTest03_ = conTest03_.prepareStatement(selectQueryTest03_);
     
                   // initialisat° de la variable de type
                   // ResultSet
                   // execute la requete
                   rsTest03_ = p_stmtTest03_.executeQuery();
     
                   while (rsTest03_.next()) {
     
                      obList01Test03_.add(rsTest03_.getString("prenom"));
     
                   }            
     
                } catch(SQLException except) {
     
                   //
                   System.out.println("Except°:");
                   System.out.println("Fichier: F03_emprunt_controller.java");
                   System.out.println("Methode: test02_()");
                   Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, except);
     
                }
     
             System.out.println("contenu de obList01Test03_");
             System.out.println(obList01Test03_);
             return obList01Test03_;
             }                             
          }; 
       }                     
      };
    }
    Voilà ou j'en suis car pr le moment, j'ai 1 erreur sur le type de retour
    de la méthode
    "cannot convert from ObservableList<String> to ObservableList<Result>
    et là, j'ai du mal. je vais faire des recherches

    PS:
    Faudrait me dire stp, si mes types de retour st bons.

    Je patauge, je patauge... avec des bottes

    Merci pr ta réponse.
    passe 1 bonne soirée (ou journée).
    grub

    [EDIT]
    arf, je viens de relire,
    tu me dis de convertir la valeur de retour en Result[] ou List<Result>
    [/EDIT]

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par grub_fr Voir le message
    Re,
    Bon alors

    pr le type Result
    il a fallu importer
    le module: javax.xml.transform.Result;
    Sauf qu'il s'agissait ici d'une classe perso dont le code est donne juste après.........................
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Un exemple tres simple sur comment implementer la chose avec une requete bidon.

    Result.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    package test.tablesql;
     
    record Result(String book, String borrower) {
    }
    strings.properties
    Code TEXT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    query.label=Requête
    book.label=Livre
    borrower.label=Emprunteur

    TableScreen.fxml
    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.TableColumn?>
    <?import javafx.scene.control.TableView?>
    <?import javafx.scene.control.ToolBar?>
    <?import javafx.scene.layout.BorderPane?>
     
    <BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.tablesql.TableScreenController">
        <center>
        <TableView fx:id="tableView">
          <columns>
             <TableColumn fx:id="bookColumn" prefWidth="75.0" text="%book.label" />
             <TableColumn fx:id="borrowerColumn" prefWidth="75.0" text="%borrower.label" />
          </columns>
          <columnResizePolicy>
             <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
          </columnResizePolicy></TableView>
        </center>
       <top>
          <ToolBar prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
            <items>
              <Button fx:id="queryButton" mnemonicParsing="false" onAction="#doQueryAsync" text="%query.label" />
            </items>
          </ToolBar>
       </top>
    </BorderPane>

    TableScreenController.java
    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
    package test.tablesql;
     
    import javafx.beans.property.SimpleStringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.concurrent.Service;
    import javafx.concurrent.Task;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
     
    import java.net.URL;
    import java.util.Optional;
    import java.util.ResourceBundle;
     
    public final class TableScreenController implements Initializable {
        @FXML
        private TableView<Result> tableView;
        @FXML
        private TableColumn<Result, String> bookColumn;
        @FXML
        private TableColumn<Result, String> borrowerColumn;
        @FXML
        private Button queryButton;
        private final ObservableList<Result> queryResult = FXCollections.observableArrayList();
     
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
            tableView.setItems(queryResult);
            bookColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().book()));
            borrowerColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().borrower()));
        }
     
        private Service<Result[]> queryService;
     
        @FXML
        private void doQueryAsync() {
            Optional.ofNullable(queryService)
                    .ifPresent(Service::cancel);
            queryService = null;
            queryResult.clear();
            queryButton.setDisable(true);
            final var service = new Service<Result[]>() {
                @Override
                protected Task<Result[]> createTask() {
                    return new Task<Result[]>() {
                        @Override
                        protected Result[] call() throws Exception {
                            // FAIRE LA REQUETE ICI.
                            // LE SLEEP EST JUSTE POUR SIMULER UNE TACHE DE LONGUE DUREE.
                            Thread.sleep(2000);
                            final var result = new Result("The Neverending Story", "Atreyu");
                            return new Result[] {result};
                        }
                    };
                }
            };
            service.setOnSucceeded(e -> {
                final var results = (Result[])e.getSource().getValue();
                queryResult.setAll(results);
                queryButton.setDisable(false);
            });
            service.setOnCancelled(e -> {
                queryButton.setDisable(false);
            });
            service.setOnFailed(e -> {
                queryButton.setDisable(false);
            });
            queryService = service;
            queryService.start();
        }
    }
    Main.java
    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
    package test.tablesql;
     
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
     
    import java.util.ResourceBundle;
     
    public final class Main extends Application {
        @Override
        public void start(final Stage stage) throws Exception {
            final var bundle = ResourceBundle.getBundle("test/tablesql/strings");
            final var fxmlURL = getClass().getResource("TableScreen.fxml");
            final var fxmlLoader = new FXMLLoader(fxmlURL, bundle);
            final var root = fxmlLoader.<Parent>load();
            final var scene = new Scene(root);
            stage.setTitle("Test");
            stage.setWidth(800);
            stage.setHeight(600);
            stage.setScene(scene);
            stage.show();
        }
    }
    module-info.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    module dvp.fx {
        requires javafx.graphics;
        requires javafx.controls;
        requires javafx.fxml;
        exports test.tablesql;
        opens test.tablesql to javafx.fxml;
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Hop hop hop

    Bon, apres 3 jours de bataille intensive, je suis arrivé a qque chose... au résultat espéré
    3 jours parce que je ne sais pas (re)lire le code et qu'il a fallut 1 accident pr que je tombe sur la soluce.

    1° code crade et lourdingue
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    public final class TableScreenController implements Initializable {
        @FXML
        private TableView<Result> tableView;
        @FXML
        private TableColumn<Result, String> bookColumn;
        @FXML
        private TableColumn<Result, String> borrowerColumn;
        @FXML
        private Button queryButton;
     
        private final ObservableList<Result> queryResult = FXCollections.observableArrayList();
        private final ObservableList<Result> queryResult__ = FXCollections.observableArrayList();
     
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
            tableView.setItems(queryResult);
            bookColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().book()));
            borrowerColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().borrower()));
        }
     
        private Service<Result[]> queryService;
     
        @FXML
        private void doQueryAsync() {
            Optional.ofNullable(queryService)
                    .ifPresent(Service::cancel);
            queryService = null;
            queryResult.clear();
            queryButton.setDisable(true);
            final var service = new Service<Result[]>() {
     
                @Override
                protected Task<Result[]> createTask() {
     
                    return new Task<Result[]>() {
     
                        @Override
                        protected Result[] call() throws Exception {
     
                        	// FAIRE LA REQUETE ICI.
                        	String selectQueryTest03_;
    		        		Connection conTest03_;
    		        		PreparedStatement p_stmtTest03_;
    		        		ResultSet rsTest03_ = null;
     
    		        		ObservableList<String> obListPrenom = FXCollections.observableArrayList();
    		        		ObservableList<String> obListTitre = FXCollections.observableArrayList();
     
    		        		int nbre_ergts = 0;
     
    		        		// redact° de la requete
    		        		selectQueryTest03_ = "SELECT client.prenom, livre.titre\n"
    		        				+ "FROM client, livre\n"
    		        				+ "INNER JOIN emprunt\n"
    		        				+ "WHERE client.id_abonne = emprunt.id_abonne\n"
    		        				+ "AND emprunt.id_livre = livre.id_livre";
     
    		        		conTest03_ = DB.getCon();
     
    		        		try {
    		                    p_stmtTest03_ = conTest03_.prepareStatement(selectQueryTest03_);
    		                    rsTest03_ = p_stmtTest03_.executeQuery();
     
     
    		                    while (rsTest03_.next()) {
     
    		                    	obListPrenom.add(rsTest03_.getString("prenom"));
    		                    	obListTitre.add(rsTest03_.getString("titre"));
     
    		                    	nbre_ergts++;
     
    		                    }
     
     
    		        		} catch(SQLException except) {
    		        			//
    		        			System.out.println("Except°:");
    		                	System.out.println("Fichier: F03_emprunt_controller.java");
    		                	System.out.println("Methode: test02_()");
    		                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, except);
    		        		}		        		
     
                            // LE SLEEP EST JUSTE POUR SIMULER UNE TACHE DE LONGUE DUREE.
                            Thread.sleep(2000);
     
                            // fonctionne
                            Result result02X = null;
     
                            for (int i = 0; i < nbre_ergts; i++) {
                            	result02X = new Result(obListTitre.get(i), obListPrenom.get(i));
                            	queryResult.addAll(result02X);
                            }
     
                            System.out.println("--" + queryResult__.get(1));
                            // System.out.println("--" + queryResult__.size());
     
                            return new Result[] { };                
     
                        }
     
                    };
     
                }
     
            };
     
            service.setOnSucceeded(e -> {
                final var results = (Result[])e.getSource().getValue();
                queryResult.setAll(results);
                queryButton.setDisable(false);
            });
            service.setOnCancelled(e -> {
                queryButton.setDisable(false);
            });
            service.setOnFailed(e -> {
                queryButton.setDisable(false);
            });
            queryService = service;
            queryService.start();
        }
    }
    y'a des choses en trop, j'ai allégé (faute d'optimiser)

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    public final class TableScreenController implements Initializable {
        @FXML
        private TableView<Result> tableView;
        @FXML
        private TableColumn<Result, String> bookColumn;
        @FXML
        private TableColumn<Result, String> borrowerColumn;
        @FXML
        private Button queryButton;
     
        private final ObservableList<Result> queryResult = FXCollections.observableArrayList();
        private final ObservableList<Result> queryResult__ = FXCollections.observableArrayList();
     
        @Override
        public void initialize(URL url, ResourceBundle resourceBundle) {
            tableView.setItems(queryResult);
            bookColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().book()));
            borrowerColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue().borrower()));
        }
     
        private Service<Result[]> queryService;
     
        @FXML
        private void doQueryAsyncX() {
        	 Optional.ofNullable(queryService)
             .ifPresent(Service::cancel);
     
    		 queryService = null;
    		 queryResult.clear();
    		 queryButton.setDisable(true);
    		 final var service = new Service<Result[]>() {
     
    		     @Override
    		     protected Task<Result[]> createTask() {
     
    		         return new Task<Result[]>() {
     
    		             @Override
    		             protected Result[] call() throws Exception {
     
    		             	// FAIRE LA REQUETE ICI.
    		             	String selectQueryTest03_;
    		        		Connection conTest03_;
    		        		PreparedStatement p_stmtTest03_;
    		        		ResultSet rsTest03_ = null;
     
    		        		//
    		        		ArrayList<Result> listeStockResult = new ArrayList<Result>();
     
    		        		// déclarat° instance de type Result qui
    		        		// recevra le prenom des emprunteurs et
    		        		// le titre des livrers empruntés
    		        		Result result = null;
     
    		        		// redact° de la requete
    		        		selectQueryTest03_ = "SELECT client.prenom, livre.titre\n"
    		        				+ "FROM client, livre\n"
    		        				+ "INNER JOIN emprunt\n"
    		        				+ "WHERE client.id_abonne = emprunt.id_abonne\n"
    		        				+ "AND emprunt.id_livre = livre.id_livre";
     
    		        		//
    		        		conTest03_ = DB.getCon();
     
    		        		try {
     
    		        			//
    		                    p_stmtTest03_ = conTest03_.prepareStatement(selectQueryTest03_);
     
    		                    //
    		                    rsTest03_ = p_stmtTest03_.executeQuery();
     
    		                    while (rsTest03_.next()) {
     
    		                    	// initialisat° instance
    		                    	result = new Result(rsTest03_.getString("prenom"), rsTest03_.getString("titre"));
     
    		                    	// stocke les instances de type Result
    		                    	listeStockResult.add(result);
     
    		                    }
     
    		        		} catch(SQLException except) {
     
    		        			//
    		        			System.out.println("Except°:");
    		                	System.out.println("Fichier: F03_emprunt_controller.java");
    		                	System.out.println("Methode: test02_()");
    		                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, except);
    		        		}		        		
     
    		                // LE SLEEP EST JUSTE POUR SIMULER UNE TACHE DE LONGUE DUREE.
    		                Thread.sleep(2000);
     
    		                //
    		                queryResult.addAll(listeStockResult);
     
    		                System.out.println("--" + queryResult__.get(1));
    		                System.out.println("--" + queryResult__.size());
     
    		                return new Result[] { };                
     
    		             }
     
    		         };
     
    		     }
     
    		 };
     
    		 service.setOnSucceeded(e -> {
    		     final var results = (Result[])e.getSource().getValue();
    		     queryResult.setAll(results);
    		     queryButton.setDisable(false);
    		 });
    		 service.setOnCancelled(e -> {
    		     queryButton.setDisable(false);
    		 });
    		 service.setOnFailed(e -> {
    		     queryButton.setDisable(false);
    		 });
    		 queryService = service;
    		 queryService.start();
        }
     
     
    }
    QQues questions avt de marquer en RESOLU

    on retourne bien 1 tableau qui "devrait" contenir des instances de Result?
    Ce tableau est vide?
    Pourquoi on doit retourner qque chose si c'est vide? A cause des types de retour des méthodes redéfinies (ou surchargées, je sais qu'il y a 1 difference)?

    t'est il possible de fournir 1 explication sur l'instruction
    Optional.ofNullable...
    ca fait 2x que tu me la sors et elle fait peur.

    Enfin j'ai ouvert 1 post ds eclipse parce y'a 1 truc que je pige pas, ms bon il me semble qu'eclipse, ça n'est pas trop ta tasse de thé. Je verrai si qqu'un répond la bas.

    Je vais laisser tel quel 2-3 j car maintenant faut que j'intègre... la chose au projet.
    Je vais modifier le titre pr que ce soit + raccord avec ta soluce.
    [EDIT]
    ben a priori c'est pas possible, ou alors c'est tt a fait possible que je ne trouve pas
    [/EDIT]

    Encore 1x, un grd merci a toi bouye.
    J'etudie, je medite, je teste.

    a+ et bon we.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    pr le probleme d'affichage de la TV,
    (reference au post posté ds le forum eclipse,
    il faut degager les L 113 et 114

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut


    queryResult__ set à rien -> poubelle !
    Tu contournes le fait de d'avoir une tache dans un thread séparé en stockant immédiatement les valeurs retournées dans queryResult ! C'est pas comme ça que c'est sensé marcher ! Ou du moins ce genre de choses est possible quand le programmeur sait ce qu'il fait !
    Tu as même conservé le Thread.sleep(2000); malgré le commentaire situé juste au dessus disant qu'il sert strictement à rien (il est présent juste pour simuler un test).

    Tu veux retourner une List<Result> au lieu d'un Result[] ? Ben tu as juste à remplacer le type dans :
    1. la déclarations et la création du service
    2. la déclaration et la la création de la tache
    3. retourner la bonne valeur à la fin de la tache
    4. changer le cast dans setOnSuceeded()
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    conducteur autocar
    Inscrit en
    Janvier 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : conducteur autocar
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    queryResult__ est allé à la poubelle.

    Tu contournes le fait de d'avoir une tache dans un thread séparé en stockant immédiatement les valeurs retournées dans queryResult !
    oui je comprends,
    j'ai déplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<Result> listeStockResult = new ArrayList<Result>();
    au moment de la déclaration de la méthode test03_()
    et
    j'ai déplacé le remplissage de queryResult
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    queryResult.addAll(listeStockResult);
    dans le onSucceeded

    pour le thread 2000
    ben oui il ne sert a rien, mais oui j'ai pas enlevé, on était en test à ce moment donc ce n'est pas ça qui me préoccupait

    pour modifier le retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result[] en list<Result>
    j'avais bien idée de comment faire mais ton Result[] va très bien, donc ça reste tel quel.

    Bon, je suis quand même heureux de te (vous) annoncer que l'appli est quasi terminée.
    Enfin elle est fonctionnelle mais il reste
    • point qui fera sujet d'un autre post après recherche: la MAJ de la TableView.
    • debogage
    • d&ployer l'appli sur les plateformes et/ou page web (je ne sais même pas si c'est possible).



    passez une bonne journée,
    bouye, merci de ton aide et pour ta disponibilité.
    a+
    je passe en résolu

    grub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sql jointure des tables et regroupement
    Par Abed_H dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/02/2009, 10h59
  2. requete sql jointure + sum() + group by?
    Par bylka dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2008, 12h06
  3. requete sql jointure
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/03/2008, 11h02
  4. [SQL] Probleme requete sql (jointure)
    Par Pepito2030 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/09/2006, 18h15
  5. Requete SQL jointure plusieurs tables
    Par bibicha dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo