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

Composants Java Discussion :

Récupérer et afficher les infos contenues dans la base de données d'un élément sélectionné dans une JLIST


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Récupérer et afficher les infos contenues dans la base de données d'un élément sélectionné dans une JLIST
    Bonjour,
    je suis un debutant en Java et je fait face à un probleme depuis des jours et je me suis resolut à solliciter votre aide !!
    Pour faire court et simple : Comment on recupère les infos de la base de donnée, à partir de ce qui a ete selectionner dans la JList.
    En faite, un utilisateur choisis un element dans une liste et on lui affiche toutes les infos de cet element contenu dans la Base de donnée à travers un tableau !!


    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
     
    try {
    		Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    		connection = DriverManager.getConnection("jdbc:mysql://localhost/mabase","root","");
    		statement = connection.createStatement();
    		result = statement.executeQuery("SELECT types_pdt FROM Cat1");
     
     
    	    while(result.next())
            { 
     
                dlm.addElement(result.getString("types_pdt"));
     
     
            }
     
    	 list.setModel(dlm);
    		list.setSelectedIndex(0);
    		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
     
        JPanel pan5 = new JPanel();
        pan5.setBackground(Color.orange);
        pan5.add(tab, BorderLayout.CENTER);
     
    	JPanel pan6 = new JPanel();
    	pan6.setBackground(Color.cyan);
     
     
    	JPanel pan7 = new JPanel();
    	pan7.setBackground(Color.GREEN);
    	pan7.add(lab);
    	pan7.add(list);
     
    	split2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pan7, pan5);
     
    	split1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, split2, pan6);
    	this.getContentPane().add(split1, BorderLayout.CENTER);
     
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
    	list.addListSelectionListener(new AccesInfosPdt());
     
    	this.setVisible(true);
     
     
     
     
     
    }
    class AccesInfosPdt implements ListSelectionListener{
     
     
    	public void valueChanged(ListSelectionEvent arg0) {
     
     
     
     
    	if (!arg0.getValueIsAdjusting()) {
    			String pdt = (String) list.getSelectedValue();
    		System.out.println("Choix : " +pdt); //pour tester la sortie
     
    	try {
    		Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    		connection = DriverManager.getConnection("jdbc:mysql://localhost/mabase","root","");
    		statement = connection.createStatement();
    		result = statement.executeQuery("select Shops, Prix from ' "+ pdt +" ' ");
    		String columns[] = {"Shops","Prix"};
    		String data[][] = new String[4][2];
    		int i = 0;
    		while(result.next()) {
    			String shop = result.getString("Shops");
    			int prix = result.getInt("Prix"); 
    			data[i][0]= shop;
    			data[i][1] = prix + "";
    			i++;
     
    	}
     
    	tab = new JTable(data, columns);
    	tab.setShowGrid(false);
    	tab.setRowHeight(30);
    	tab.setTableHeader(null);	
     
     
     
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
    	}
    }
    }
    }

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Erreure Trouver .... Mais un autre pb d'affichage du tableau...
    Salut, enfin j'ai trouver où etait le pb.
    en lieu et place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = statement.executeQuery("select Shops, Prix from ' "+ pdt +" ' ");
    fallait plutot mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = statement.executeQuery("select Shops, Prix from "+ pdt +"  ");
    Maintenant, les informations sont bien recuperer........ au niveau de la console et je n'arrive pas à les afficher par le tableau que j'ai prevu pour cela !!! Bref... mon tableau reste desesperement vide, pourtant les infos sont dispo au niveau de la console... quelqun pourrait-il regarder et me dire ce qui ne va pas ?

    Merci

  3. #3
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Comme beaucoup vous remplacez la référence de tab par une nouvelle instance de JTable, mais vous ne remplacez pas le "visuel". Pour celà il vous faudrait supprimer l'ancienne JTable de son conteneur (pan5) et ajouter la nouvelle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pan5.invalidate();
    pan5.removeAll();
    pan5.add(tab);
    pan5.revalidate();


    Même si j'ai le sentiment de me répèter, Swing est un modèle MVC. Ce modèle n'est pas compliqué à comprendre mais facilite grandement les choses car vous n'avez plus à modifier vos vues en supprimant et ajoutant des élements. Il suffit de modifier le modèle pour que les vues se mettent à jour.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Afficher ma JTable
    Salut,
    merci bcp gervais.b pour ta disponibilite.
    Mais je vais etre honnete pour te dire que j'ai pas vraiment compris ton explication.
    "Comme beaucoup vous remplacez la référence de tab par une nouvelle instance de JTable, mais vous ne remplacez pas le "visuel"..... je ne vois pas du tout !! Pourrais-tu etre plus explicite dessus, en utilisant mon exemple de code ?


    merci pour ta comprehension et ton aide...

  5. #5
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Dans cette partie, vous déclarez le conteneur pan5 qui devrait contenir tab.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JPanel pan5 = new JPanel();
        pan5.setBackground(Color.orange);
        pan5.add(tab, BorderLayout.CENTER);
    Plus loin, lorsque vous avez récupérer vos informations, vous faites ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tab = new JTable(data, columns);
    	tab.setShowGrid(false);
    	tab.setRowHeight(30);
    	tab.setTableHeader(null);
    C'est à dire que vous écrasez le référence de tab par une nouvelle. Mais l'ancienne reste présente et affichée dans pan5. C'est juste que la JTable de pan5 n'est plus celle représentée par tab. Si vous imprimez tab avant et après, vous verrez que le résultat n'est pas le même c'est une preuve que cette variable ne représente plus la même chose*.

    Il faut donc en plus de celà, rajouter le code que je vous ai donné précédemment pour supprimer le contenu de pan5 et le remplacer par votre nouvelle JTable. Un autre méthode un peu plus propre serait d'utiliser tab.getModel().setValueAt(...) pour modifier le contenu de votre JTable dans la boucle while(result.next()) {.


    * Pas tout à fait, mais restons sur des concepts simples.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Afficher ma JTable
    Salut à nouveau gervais.b

    je te remercie deja une fois de plus pour cette disponibilité...... je sais que tout semble très évident pour vous et sans doute vous etes embeter d'expliquer ce aui semble très évident à votre niveau.
    Sauf que moi, je suis nouveau sur Java, et donc forcement les concepts faut un peu plus me les faire comprendre pour que ca passe ...

    J'ai essayer vos conseils, mais je galere toujours dessus, rien n'a changer de mon coter... du coup je me demandais, si il ne fallait pas plutot aue j'essayes avec l'autres methodes que vous evoquer ici : "Un autre méthode un peu plus propre serait d'utiliser tab.getModel().setValueAt(...) pour modifier le contenu de votre JTable dans la boucle while(result.next()) {.
    "


    Pouvez-vous me dire comment je peux le faire dans mon cas ici ?

    Merci beaucoup pour vos efforts....

  7. #7
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Il n'y a pas de dérangement, sans quoi je ne serais pas ici. Mais il faut faire attention a la susceptibilité de chacun et y aller en douceur. Un développeur plus avancé pourrait mal prendre une explication détaillée sur les références. Bref.


    Comme je le dit plus haut, la meilleure solution serait d'appliquer le MVC et d'utiliser un modèle dédié. Je peux vous fournir un exemple complet qui représente cela mais ça ne vous aiderais pas beaucoup pour la compréhension.

    La seconde solution est évidemment de travailler avec le modèle de la 'JTable' mais, encore une fois, ça me semble un peu trop a ce stade.
    La troisième solution est de vous dire exactement où placer l'exemple de code que je vous ai donné (celui avec 'invalidate()'). Mais, une fois de plus, j'ai l'impression que ce n'est pas la bonne solution.

    Commençons par une rapide explication sur les références. Imaginez qu'une réfèrence est une adresse qui vous rattache a quelque chose. Vous avez votre variable 'tab' et son adresse qui permet d'y accéder.
    Étant donné que votre 'pan5' a besoin d'afficher 'tab', il faut lui fournir cette adresse grâce a laquelle il peut obtenir toutes les informations nécessaires pour l'afficher et même lui demander se dessiner (ou des tas d'autres choses). Tout va bien ici, 'pan5' a une référence sur 'tab' et il peut l'afficher.

    Lorsque vous sélectionnez un élément de la liste, vous faites une requête et parcourez le résultat pour créér le futur contenu de votre table 'tab'. C'est un choix, ça va fonctionner.

    Le problème est que juste après, avec la ligne 'tab = new JTable(..)' vous créez une nouvelle table, a une nouvelle adresse. Donc 'pan5' ne saura jamais reafficher le nouveau contenu car il va continuer d'aller voir a la mauvaise adresse.


    La première solution que je vous proposait était donc de nettoyer 'pan5' et de lui donner la nouvelle adresse a utiliser. C'est cela le bout de code avec 'invalidate()'. Et vous aurez sûrement compris que ce code doit être placé après votre boucle, juste après que vous ayez change l'adresse de 'tab' en en créant une nouvelle.
    Cette solution doit fonctionner mais n'est pas idéale car vous allez créer une 'JTable' et un tableau a chaque sélection dans la liste.

    La seconde solution est d'utiliser le modèle de 'tab'. Dans cette version, vous ne changez jamais l'adresse de 'tab', vous ne faites qu'un seul 'tab = new JTable()' au debut de votre code. Son adresse ne changera plus. Par contre dans votre boucle, au lieu de créér un tableau vous allez modifier le contenu de 'tab' (mais pas son adresse, juste son contenu) en utilisant 'tab.getModel().setValueAt(..., ligne, 1)'. '...' sera la valeur que vous voulez afficher, un des champs du ResultSet. 'ligne' sera le numéro de la ligne qui doit contenir la valeur (la première étant 0). Et '1' est la colonne qui doit contenir la valeur (la première étant 0, vous afficherez dans la seconde colonne).
    Le code contenu dans 'JTable' et derrière son modèle va se charger de mettre a jour l'affichage pour refléter le changement.

    La troisième solution, celle du MVC est a proscrire tant que vous n'aurez pas maîtrisé les deux premiers solutions, surtout la seconde.


    J'espère que cela est plus clair pour vous. N'hésitez pas a demander plus de précisions sur les points bloquants.


    (Désolé pour le manque de mise en forme, je suis sur mobile).

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Afficher ma JTable
    Salut Gervais.b
    j'ai lu attentivement vos recommandations et je m'y suis mis depuis des longues heures, mais mon pb reste tout entier ..
    aussi, je me demande si vous avew bien regarder mmon code plus haut en entier et si de votre coter vous avez essayer d'appliquer une des methodes...
    Je suis rester sur la methode de JTable"creer une noulle adress" et la mettre à jour plus bas.. mais là, j'ai une erreure sur mon "pan5" où on me demande "create a local variable"
    Avant cela, j'ai essayer une autre methode sur la base du DefaultModel comme ceci :

    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
     
    	try {
    		Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    		connection = DriverManager.getConnection("jdbc:mysql://localhost/mabase","root","");
    		statement = connection.createStatement();
    		result = statement.executeQuery("select Shops, Prix from  "+ pdt +"  ");
    		String columns[] = {"Shops","Prix"};
    		String data[][] = new String[4][2];
    		int i = 0;
    		while(result.next()) {
    			String shop = result.getString("Shops");
    			int prix = result.getInt("Prix"); 
    			data[i][0]= shop;
    			data[i][1] = prix + "";
    			i++;
     
    			System.out.println(" dans la boutique " +shop+ "au prix de : " +prix); // je testes pourtant à ce niveau et tout s'affiche correctement, donc je recupere bien les infos pour les afficher dans ma tab
    	}
     
    	DefaultTableModel model = new DefaultTableModel(data, columns);
        JTable tab = new JTable(model);
    	tab.setShowGrid(false);
    	tab.setRowHeight(30);
    	tab.setTableHeader(null);
    je n'ai toujours rien ... je me demande si mon pb finalement ne se trouve pas au niveau de la classe interne que j'ai creer pour utiliser le "ListSelectionListener"................ que je vais remettre ici pour une vue d'ensemble de ma classe générale:

    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
     
    public FenetreTest() {
     
    	this.setTitle("AppShopXwork2-B");
    	this.setLocationRelativeTo(null);
    	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	this.setSize(500, 300); 
    	try {
    		Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    		connection = DriverManager.getConnection("jdbc:mysql://localhost/mabase","root","");
    		statement = connection.createStatement();
    		result = statement.executeQuery("SELECT types_pdt FROM Cat_boissons");
     
     
    	    while(result.next())
            { 
     
                dlm.addElement(result.getString("types_pdt"));
     
     
            }
     
    	 list.setModel(dlm);
    		list.setSelectedIndex(0);
    		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
     
        JPanel pan5 = new JPanel();
        pan5.setBackground(Color.BLUE);
        pan5.add(tab);
     
     
     
     
     
    	JPanel pan6 = new JPanel();
    	pan6.setBackground(Color.cyan);
     
     
    	JPanel pan7 = new JPanel();
    	pan7.setBackground(Color.GREEN);
    	pan7.add(lab);
    	pan7.add(list);
     
     
    	split2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pan7, pan5);
     
    	split1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, split2, pan6);
    	this.getContentPane().add(split1, BorderLayout.CENTER);
     
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
    	list.addListSelectionListener(new AccesInfosPdt());
     
    	this.setVisible(true);
     
     
     
     
     
    }
    class AccesInfosPdt implements ListSelectionListener{
     
    	public void valueChanged(ListSelectionEvent arg0) {
     
    	if (!arg0.getValueIsAdjusting()) {
    			String pdt = (String) list.getSelectedValue();
    		System.out.println("Choix : " +pdt);
     
    	try {
    		Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    		connection = DriverManager.getConnection("jdbc:mysql://localhost/mabase","root","");
    		statement = connection.createStatement();
    		result = statement.executeQuery("select Shops, Prix from  "+ pdt +"  ");
    		String columns[] = {"Shops","Prix"};
    		String data[][] = new String[4][2];
    		int i = 0;
    		while(result.next()) {
    			String shop = result.getString("Shops");
    			int prix = result.getInt("Prix"); 
    			data[i][0]= shop;
    			data[i][1] = prix + "";
    			i++;
     
    			System.out.println(" dans la boutique " +shop+ "au prix de : " +prix);
    	}
     
    	DefaultTableModel model = new DefaultTableModel(data, columns);
        JTable tab = new JTable(model);
    	tab.setShowGrid(false);
    	tab.setRowHeight(30);
    	tab.setTableHeader(null);
     
     
     
     
     
    	}catch (Exception e) {
    		e.printStackTrace();
    	}
     
    	}
     
     
    }
    }
    }
    Bref.... point 0, galere +++++

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2020
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Afficher ma JTable

    Salut Gervais.b ......
    j'ai pu ENFFFFFFFFFFFFFFFFFIIIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNN TROUVER MON PB

    J'ai pu garder la methode avec JTable, le pb d'erreure .. il fallait declarer ma variable plus haut en "public" et donc à la fin ajouter le bout de code avec "invalidate" etc... juste à la fin de ma boucle.... CA MARCHE...CA MARCHE !!!!

    Mon dernier souci sera maintenant, de mettre un autre listener sur le tableau que j'ai obtenu afin de créer un autre tableau qui regroupera tous les choix des produits de l'utilisateur...
    j'esperes avoir votre permission de revenir avec ce code là si j'ai encore des difficultés dessus...

    Deja un trèèèèèèès grand Merci à vous !!!

    PS : pouvez-vous me recommander un bon tuto sur la creation et gestion des sessions utilisateurs ? ...

  10. #10
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Avec plaisir, n'oubliez pas de marquer la question comme résolue si ce n'est déjà fait.

    Pour la gestion de "sessions utilisateurs", je n'ai rien qui me vienne en tête. Si vous ne trouvez rien dans vos recherches, je vous conseille de poser une nouvelle question sur ce forum en détaillants le contexte et vos besoins.


    Bonne journée

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 22/07/2009, 14h19
  2. Réponses: 4
    Dernier message: 27/01/2009, 18h14
  3. récupérer une info contenue dans une fenetre modale
    Par glouffy6 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2008, 23h51
  4. [O-00] Afficher les images contenu dans un message
    Par Brunodm13 dans le forum Outlook
    Réponses: 5
    Dernier message: 17/12/2008, 18h53
  5. Réponses: 7
    Dernier message: 24/04/2006, 15h48

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