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

AWT/Swing Java Discussion :

Remplir une JComboBox à l'aide d'une requête ?


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut Remplir une JComboBox à l'aide d'une requête ?
    Salut à tous!

    Bon je suis pas sur d'être dans la bonne section, mais je pense que c'est bien un problème d'ordre général. C'est peut être un peu complexe à expliquer, mais je vais faire de mon mieux :

    En fait je dois développer une petite interface qui permet d'intéragir avec une base de donnée (pas besoin des détails). La base de donnée possède une table avec la structure suivante :

    (concept_ID, glossary_ID, term, Wiki_concept, language)

    En gros, à chaque terme dans la base correspond un wiki_concept : par exemple pour le terme "java" on aura les wiki "café", "language de prog" etc...

    Ca va jusque la?

    Bon...donc, mon interface permet en gros de faire ressortir toutes les informations concernant un terme que l'utilisateur rentre dans un textfield.

    MAIS

    Je dois en fait accessoirement ajouter une liste (moi je prefere une JComboBox c'est plus propre) qui affiche tous les wiki_concepts qui peuvent correspondre à un terme que l'utilisateur rentre!

    En gros voila à quoi ca ressemble :



    Maintenant, la ou je bloque :

    Je ne parviens pas à remplir cette combobox avec les wiki. L'idée de base étant d'avoir un tableau de string que je vais remplir à l'aide d'une bête requete qui demande à la base de me renvoyer tous les wiki_associés au terme entré par l'utilisateur...mais le probleme c'est que je ne parviens pas à trouver un moyen de remplir le tableau puis d'afficher son contenu dans la combobox. En fait le code ressemble à ca:

    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
     
    public class UserInterface extends JFrame implements ActionListener {
     
    	private String [] wiki;
     
    	public UserInterface() {
     
    	//Dans cette partie du code on à la création et la mise en place des différents composants de l'interface, dont :
    	JComboBox cb = new JComboBox(wiki);
     
    	JButton b = new JButton("Search Wikis");
    	b.addActionListener(this);
     
    }
     
    }
     
    ...
     
    public void actionPerformed(ActionEvent ae)  {
     
    if(ae.getSource().equals(b)) {
    			try {
    			String s = "Select distinct wiki_concept from analyser.glossaries where trim(term)=?";
    			ps1 = dbConnection.prepareStatement(s);
    			ps1.setString(1,tf.getText().toString());
    			ResultSet rs1 = ps1.executeQuery();
    			int length = 0;
     
    			while (rs1.next()){
    				length++;
    				String name1 = rs1.getString(1);
    				for (i=1;i<length;i++) {
    				wiki[i]=name1;	
     
    					}
    				}
    			}
     
    		catch (Exception e){
    			System.out.println("Error : "+e);
    		}
    		}
     
    }
    PETITE PRECISION : le code au dessus est il me semble "foireux" avec le length, mais c'est pour montrer l'idée plus qu'autre chose

    Les problemes:

    -Je ne peux pas connaitre la taille du tableau à l'avance car je ne connais pas le nombre de wiki_concepts pour un terme donné, je peux pas initialiser le tableau. Donc je me suis dis que j'ai qu'a créer un entier "length" que j'incrémente de 1 pour chaque résultat qu'il trouve => ca sera la taille du tableau.
    -Meme si je parviens à remplir le tableau dans la partie actionlistener, comment je fais pour le "remonter" dans la premiere partie du code pour le combobox affiche ce qu'il y a dedans?...

    J'espere avoir été aussi clair que possible...en fait c'est plus un problème de modélisation que j'ai je crois, j'ai besoins d'yeux neufs dessus :p

    N'hésitez pas à demander si un truc n'est pas logique, je ne voulais juste pas poster les 200 lignes de code de l'interface

    Merci pour la lecture!

    Salutations et bon w-e à tous,

    Spl0tch

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Dans l'api de JCheckbox tu verras une méthode addItem qui te permet de faire très simplement ce que tu veux...

    Il faut encore noter quelque chose... Tu fais une requete sur la base de données dans la méthode actionPerformed, or tu te trouves dans l'EDT ce qui fait que si ton traitement devient un peu long, ton interface peut devenir anormal alors fais attention. Si jamais jète un oeil sur SwingWorker pour un traitement long en tâche de fond..
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Je suppose que tu veux parler de l'API de JComboBox et non de JCheckBox , j'ai en effet vu le addItem en cherchant sur le net. Je regarderai aussi pour swingworker, merci pour le conseil

    Question : est ce que la méthode que j'emploie pour définir la longueur du tableau avec le "length" est une bonne idée? Est elle bien implémentée?

    Merci pour ta réponse rapide!

    EDIT :

    Ou alors pas besoin de tableau? Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
    				String s = "Select distinct wiki_concept from analyser.glossaries where term='java'";
    				Statement st = dbConnection.createStatement();
    				ResultSet rs = st.executeQuery(s);
     
    					while (rs.next()){
    						String name1 = rs.getString(1);
    						cb.addItem(name1);
    						}
     
    					}
    		}
    Ca me semblerai être le plus facile et logique, mais marche pas

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Bon désolé de passer pour le n00b de service ( ), mais je ne parviens pas à remplir le jcombobox à travers l'actionlistener sur le bouton b, j'ai beau essayer

    Quelqu'un pourrait me proposer un (ou le bout de code) pour y parvenir? C'est à dire remplir la combobox avec ce que me retourne la requête sur la base...

    Merci

  5. #5
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Tu as une erreur ou quelque chose?

    Parce que ton appel cb.addItem devrait te rajouter ton élément comme tu l'as fait...
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Ouai j'ai quelques erreurs avec le printstacktrace, je les posterai ce soir, suis en cours la!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Avec un ptit jour de retard!

    Bon, j'ai fais un petit "code test" ou je ne fais que d'utiliser la combobox, ca m'évite d'avoir un code enorme avec l'interface pour tester...

    Alors voila ce que j'ai :

    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
     
    public ComboBoxTest() {
     
    		super();
     
    		p = new JPanel();
     
    		JComboBox cb = new JComboBox();
     
    		b = new JButton ("Wiki lookup");
    		b.addActionListener(this);
     
    		ta = new JTextArea(10,15);
     
    		try {
    			java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver ());
    		}
     
    		catch (SQLException e){
    			System.out.println("SQL error :"+e.getMessage());
    		}
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
     
    			dbConnection = DriverManager.getConnection(url,userid,password);
    			System.out.println("Connected to DataBase!");
    		}
     
    		catch (Exception e ){
    			System.out.println("Error : "+e);
    		}
    		p.add(cb);
    		p.add(b);
    		p.add(ta);
    		getContentPane().add(p);
    	setTitle("DBInterrogator");
    	setVisible(true);
    	setSize(500,460);
    	setResizable(false);
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	public static void main (String [] args){
    		new ComboBoxTest();
    	}
     
    	public void actionPerformed(ActionEvent ae)  {
    		if (ae.getSource().equals(b)) {
     
    			try {
     
    				String s = "Select distinct wiki_concept from analyser.glossaries where term='Rules'";
    				Statement st = dbConnection.createStatement();
    				ResultSet rs2 = st.executeQuery(s);
     
    					while (rs2.next()){
    						String name1 = rs2.getString(1);
    							cb.addItem(name1);		
    					}
    		}
     
    		catch (Exception e){
    			System.out.println("Error : "+e);
    			e.printStackTrace();
    		}
     
    		}
    	}
    }
    En gros : une interface avec une combobox et un bouton. Quand j'appuyes sur le bouton, il m'exécute la requête et devrai théoriquement me mettre le résultat dans la combobox. Le textarea ne sert a rien mis à part voir si la requete fonctionne correctement.

    Le programme se lance et au moment d'appuyer sur le bouton j'ai les erreurs suivantes :

    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
     
    Error : java.lang.NullPointerException
    java.lang.NullPointerException
    	at ComboBoxTest.actionPerformed(ComboBoxTest.java:79)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Donc si je comprends bien, un problème avec un tableau (le nullpointerexception). Ca me semble logique étant donné que j'initialise mon combobox sans rien, mais j'ai beau essayer avec un tableau de taille définie (ou pas) je ne parviens pas à remplir la combobox!

    Merci pour l'aide

    Bonne soirée,

    Spl0tch

  8. #8
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 140
    Points
    140
    Par défaut
    Bonsoir,
    C'est quoi ta ligne 79?

  9. #9
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Ton code n'est pas complet car la variable "cb" dans la méthode actionPerformed n'est pas définie. Je suppose donc qu'il doit y avoir un attribut "cb" dans la classe ComboBoxTest. Or, la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JComboBox cb = new JComboBox();
    définit une variable cb locale au constructeur ComboBoxTest(), et donc l'attribut "cb" n'est pas initialisé et conserve sa valeur null.
    Remplace la ligne ci-dessus par :
    Pour le reste, il ne faut pas faire de traitements longs dans les callbacks de traitement des événements, il y a eu maintes discussions ici à ce sujet, voir les différents messages ou tutoriaux ayant trait à l'EDT, SwingWorker, etc.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Points : 11
    Points
    11
    Par défaut
    Alors :

    @Tasumy - Ligne 79 : cb.addItem(name1);

    @herve91 : , tu viens de résoudre mon problème LOL! J'ai pas du faire attention car j'ai essayé plusieurs choses dans mon code, et j'ai en fait tout déclaré avant le constructeur :

    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
     
    public class ComboBoxTest extends JFrame implements ActionListener {
     
    	private String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
    	private String userid = "system";
    	private String password = "h3ll0";
    	private Connection dbConnection;
    	private JButton b;
    	private JComboBox cb; 
    	private JTextArea ta;
    	private JPanel p;
     
    	public ComboBoxTest() {
    ...
    }
    }
    Et j'ai en fait bêtement oublié d'enlever le JComboBox devant cb! Comme quoi les solutions sont souvent bien plus simples qu'elles n'en ont l'air

    Je viens de tester le code et ca fonctionne, merci merci merci

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

Discussions similaires

  1. [XL-2003] Remplir une combobox à l'aide d'une checkbox
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 28/08/2009, 16h57
  2. remplir un rapport à l'aide d'une commande
    Par asprog dans le forum Windows Forms
    Réponses: 11
    Dernier message: 23/07/2009, 01h06
  3. Réponses: 2
    Dernier message: 26/07/2007, 14h27
  4. Comment remplir un dbcombo à l'aide d'une base donnée ?
    Par eclectik dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/09/2006, 15h50
  5. Réponses: 6
    Dernier message: 09/12/2005, 11h14

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