Probléme avec JComboBox [Résolu]

chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 28 mai 2008 à 22:22 - Dernière réponse : chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention
- 31 mai 2008 à 22:17
j’ai  mis un JcomboBox et JList dans ma fenêtre, et voici le code :





private void comboBox1ItemStateChanged(ItemEvent e) {<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>








                               vect.clear();   troverliste();  texttitre.showPopup();








                               vectList.getSelectedItem();








                               list.updateList(vectList);








               
                }






private void troverliste(){






                              


 

//j’établie la connexion avec ma BD  et j’execute cette requête



               

        rs=statement.executeQuery("select distinct Titredulivre from ANNONCES where Titredulivre LIKE '"+texttitre.getSelectedItem().toString() +  "%' order by Titredulivre" );         




……


}


public void updateList (Vector v)



  
            
{






     
          listModel.clear ();






     
          for (int i = 0; i < v.size(); i++)






     
          {






        
       listModel.addElement (v.get(i));






               
 
             
}



   }


Je clique sur le Combobox et je sélectionne un item, ce  dernier va être ajouté à la List mais le code ci-dessus ajoute l’item sélectionné 2 fois dans liste. Comment éviter cette répétition.


Merci d’avance
Afficher la suite 

Votre réponse

17 réponses

cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 30 mai 2008 à 12:55
+3
Utile
Bonjour,

je me penche maintenant sur ton code mais j'aimerai te proposer une méthode pour se connecter à une base de donnée Access plus "élégante" que la tienne : elle encapsule tout le traitement et fournit des méthodes pour exécuter du code SQL et rendre le résultat sous forme de ResultSet :

import java.sql.*;

class Base {
   
    private Connection connexion = null;
    private Statement statement =


null



;
   
    public Base(String url,



String



login,



String



password) throws ClassNotFoundException, SQLException {
        // Connexion
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        connexion = DriverManager.getConnection("jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb); DBQ=" + url, login, password);
       
        // Récuperation d'un statement pour exécuter les requêtes
        statement = connexion.createStatement();
    }
   
   
    /*
         exécuter une requête Select et retourner le résultat
     
         exp:
             try {
                 ResultSet rs = interroger("select * from Film");
     
                // affichage sur l'écran
                 while(rs.next()) {
                     for(int i=1; i<=rs.getMetaData().getColumnCount(); i++)
                         System.out.println(rs.getString(i);
                 }
             }
             catch(SQLException e) {
                 e.printStackTrace();
             }
     */
    public ResultSet interroger(



String





requete) throws SQLException{
        return statement.executeQuery(requete);
    }
   
   
    /*
         exécute un requête Update ou Delete et retourne le nombre de lignes concernées par l'opération
     
        exp:
             try {                 int nompbreLigne maj("delete from Realisateur where idRealisateur 12");
             }
             catch(SQLException e) {
                 e.printStackTrace();
             }
     */
    public int maj


(String


requete) throws SQLException{
        return statement.executeUpdate(requete);
    }
   
    /*
         ferme la connexion avec la base de donnée
     */
    public void deconnecter() {
        try {
            statement.close();
            connexion.close();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }
    }
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Chatbour
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 30 mai 2008 à 13:44
+3
Utile
Re,

voici une solution temporaire : j'ai pas réussi à faire fonctionner une requete qui contient LIKE, alors je me suis débrouillé :

private JComboBox combo = new JComboBox();



private



DefaultListModel listModel =



new



DefaultListModel();




private



JList list =



new



JList(listModel);

// une référence vers notre base de donnée




private



Base laBase = new Base("bd1.mdb", "", 



""



);

(...)



private void ajouterEcouteurs() {
        combo.addItemListener(



new



ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                if(evt.getStateChange() == ItemEvent.SELECTED) {
                    // émettre une requête SELECT pour récupérer les livres correspondant
                    String requete = "select * from Livre";// where TitreDuLivre like 'j*'";//" + combo.getSelectedItem().toString() + "*'";
                   
                    // d'abord, on vide la liste
                    listModel.removeAllElements();

                    try {
                        ResultSet rs = laBase.interroger(requete);
                        while(rs.next()) {
                            String str = rs.getString("TitreDuLivre");
                            if(str.toUpperCase().charAt(0) == combo.getSelectedItem().toString().toUpperCase().charAt(0))
                                listModel.addElement(str);
                        }
                    }
                    catch(SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Chatbour
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 28 mai 2008 à 23:44
0
Utile
Salut,

je ne connais pas l'explication, mais il suffit d'utiliser un ActionListener au lieu d'un ItemListener..
Commenter la réponse de cs_Chatbour
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 28 mai 2008 à 23:51
0
Utile
Re,

ce code résout aussi le problème (je poste tout le code..) :

class Fenetre extends JFrame {
    private JComboBox combo = new JComboBox();
    DefaultListModel listModel = new DefaultListModel();
    JList list = new JList(listModel);

    public Fenetre() {
        combo.addItem("ESS");
        combo.addItem("CA");
        combo.addItem("EST");
        combo.addItem("CSS");

        JPanel pan = new JPanel();
        pan.add(combo);
        pan.add(new JScrollPane(list));
       
        this.getContentPane().add(pan);
       
        combo.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                if(evt.getStateChange() == ItemEvent.SELECTED)
                    listModel.addElement(combo.getSelectedItem());
            }
        });

        this.setSize(300, 200);
       


this



.setLocationRelativeTo(null);
       



this



.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       



this



.setVisible(true);
    }

    public static void main(String[] args) {
        new Fenetre();

    }
}
Commenter la réponse de cs_Chatbour
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 29 mai 2008 à 16:52
0
Utile
merci Chatbour pour votre réponse grâce à ton programme j'ai éviter la répétition ,mais lorsque je tape  par exemole "a" dans le combobox  pour avoir tous les livres qui commence par " a"  ,elle  est ajouter dans la liste ,comment éviter ça?
 et merci encore une fois
Commenter la réponse de chat11
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 29 mai 2008 à 20:49
0
Utile
Désolé j'ai pas compris ce que tu demandes : si tu veux expliquer d'avantage..
Commenter la réponse de cs_Chatbour
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 29 mai 2008 à 22:13
0
Utile
mon Jcombox contient une grande liste de livre pour y accéder facilement à un des livres je dois taper la premiere lettre aprés je valide par entrée pour voir ces livres mais malheureusement la letrre s'ajoute dans Jliste donc je veux éviter ça j'espere que tu ma compris maintenent merci encore chatbour.
Commenter la réponse de chat11
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 29 mai 2008 à 22:19
0
Utile
j'ajoute que le JComboBox  est editable=>combo.setEditable(true);
Commenter la réponse de chat11
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 29 mai 2008 à 23:44
0
Utile
ok :

tu essaies de remplir ta liste par les noms des livres alors que la première lettre de l'item sélectionné qui est ajoutée ?

je te propose de :

1. émettre une requete SELECT récupérant les livres dont le nom ... (comme tu as fais).



2. récupérer le résultat dans un objet ResultSet.

3. remplir ta liste avec les noms des livres figurant dans l'objet ResultSet (une boucle classique fera l'affaire).

4. fermer l'objet ResulSet.

j'espère que c'est clair maintenant : si je me trompe une autre fois poste ton code, à ce moment là je devrai piger ;)
Commenter la réponse de cs_Chatbour
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 30 mai 2008 à 00:22
0
Utile
voici mon code :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.jgoodies.forms.factories.*;
import com.jgoodies.forms.layout.*;
import java.sql.*;
import java.util.Vector;
public class lote extends JFrame {
 public lote() {
 
  initComponents();
 }


 


 private void initComponents() {
   dialogPane = new JPanel();
  contentPanel = new JPanel();
  texttitre = new JComboBox(vect);
  scrollPane1 = new JScrollPane();
   listModel = new DefaultListModel();
  list1 = new JList(listModel);
  buttonBar = new JPanel();
  okButton = new JButton();
  cancelButton = new JButton();
  CellConstraints cc = new CellConstraints();


  //this
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  Container contentPane = getContentPane();
  contentPane.setLayout(new BorderLayout());



  //dialogPane
  {
   dialogPane.setBorder(Borders.DIALOG_BORDER);
   dialogPane.setLayout(new BorderLayout());
      //contentPanel
   {
    contentPanel.setLayout(new FormLayout(
     new ColumnSpec[] {
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW),
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC,
      FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
      FormFactory.DEFAULT_COLSPEC
     },
     new RowSpec[] {
      FormFactory.DEFAULT_ROWSPEC,
      FormFactory.LINE_GAP_ROWSPEC,
      FormFactory.DEFAULT_ROWSPEC,
      FormFactory.LINE_GAP_ROWSPEC,
      FormFactory.DEFAULT_ROWSPEC,
      FormFactory.LINE_GAP_ROWSPEC,
      FormFactory.DEFAULT_ROWSPEC
     }));
    
    //---- texttitre ----
    
    texttitre.setEditable(true);
    texttitre.addItemListener(new ItemListener() {
     public void itemStateChanged(ItemEvent e) {
      comboBox7ItemStateChanged(e);
     }
    });
    contentPanel.add(texttitre, cc.xywh(3, 1, 19, 1));
        //scrollPane1
    {
     scrollPane1.setViewportView(list1);
    }
    contentPanel.add(scrollPane1, cc.xywh(3, 5, 19, 1));
   }
   dialogPane.add(contentPanel, BorderLayout.CENTER);
      //buttonBar
   {
    buttonBar.setBorder(Borders.BUTTON_BAR_GAP_BORDER);
    buttonBar.setLayout(new FormLayout(
     new ColumnSpec[] {
      FormFactory.GLUE_COLSPEC,
      FormFactory.BUTTON_COLSPEC,
      FormFactory.RELATED_GAP_COLSPEC,
      FormFactory.BUTTON_COLSPEC
     },
     RowSpec.decodeSpecs("pref")));
    
    //---- okButton ----
    okButton.setText("OK");
    buttonBar.add(okButton, cc.xy(2, 1));
    
    //---- cancelButton ----
    cancelButton.setText("Cancel");
    buttonBar.add(cancelButton, cc.xy(4, 1));
   }
   dialogPane.add(buttonBar, BorderLayout.SOUTH);
  }
  contentPane.add(dialogPane, BorderLayout.CENTER);
  }


 private void comboBox7ItemStateChanged(ItemEvent e) {
  vect.clear();
             troverliste();
            texttitre.showPopup();
         
            if(e.getStateChange() == ItemEvent.SELECTED){
                    listModel.addElement(texttitre.getSelectedItem());
                                  }
           



 }
 
 private void troverliste(){
  Connection con;
   ResultSet rs=null;
    java.sql.Statement statement=null;
        String titre ;
          try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String s = "jdbc:odbc:bd1";
            String s1 = "";
            String s2 = "";
            con = DriverManager.getConnection(s, s1, s2);
            statement = con.createStatement();
        }
        catch(Exception exception)
        {
        
        }       
        try{ 
//ma requête
         rs=statement.executeQuery("select distinct Titredulivre from ANNONCES where Titredulivre LIKE '"+texttitre.getSelectedItem().toString() +  "%' order by Titredulivre" ); // *where titre like  ' "+(String)texttitre.getSelectedItem()+"*'" */  
          while(rs.next())  {
              titre=rs.getString("Titredulivre");
              vect.addElement(titre);
               }
        }
        catch(SQLException sqlexception)
        {
            System.out.println(sqlexception);
        }



 }


 


 


  private JPanel dialogPane;
 private JPanel contentPanel;
 
 private JComboBox texttitre;
 private JScrollPane scrollPane1;
 DefaultListModel listModel;
 private JList list1;
 private JPanel buttonBar;
 private JButton okButton;
 private JButton cancelButton;
//main
  public static void main(String args[]){
  lote fen = new lote();
  fen.setVisible(true);
  fen.pack();}
}
il est long car j'ai construis ma fenêtre à l'aide de JFormDeseign .j'ai bien établies la connexion avec la BD et aussi lorsque je tape une lettre dans le combobox j'obtiens les livres qui commence par cette lettre ,mais    listModel.addElement(texttitre.getSelectedItem()); ajoute la lettre dans la liste.
merci.
Commenter la réponse de chat11
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 30 mai 2008 à 00:33
0
Utile
j'ai vraiment honte de toi ,le programme est trés long, et j'espére que tu va le comprendre.
Commenter la réponse de chat11
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 30 mai 2008 à 11:54
0
Utile
voici un code plus simple ,ja'i modifier ton programme:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.lang.Runtime;
import java.lang.Process;
import java.lang.*;
import java.sql.*;
import java.util.Vector;




class Fenetre extends JFrame {
  Vector vect=new Vector();
     Vector vect1=new Vector();
     
    private JComboBox combo = new JComboBox(vect);
    DefaultListModel listModel = new DefaultListModel();
    JList list = new JList(listModel);
   


    public Fenetre() {
      


        JPanel pan = new JPanel();
        pan.add(combo);
        pan.add(new JScrollPane(list));
       
        this.getContentPane().add(pan);
         combo.setEditable(true);
        combo.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                vect.clear();
             troverliste();
           combo.showPopup();
         
            if(evt.getStateChange() == ItemEvent.SELECTED){
                    listModel.addElement(combo.getSelectedItem());
                    vect1.add((String)combo.getSelectedItem());
                    System.out.println("vect :"+vect1);
                }
            }
        });




        this.setSize(300, 200);
        this .setLocationRelativeTo(null);
        this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this .setVisible(true);
    }
          void troverliste(){
  Connection con;
   ResultSet rs=null;
    java.sql.Statement statement=null;
        String titre ;
          try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String s = "jdbc:odbc:bd1";
            String s1 = "";
            String s2 = "";
            con = DriverManager.getConnection(s, s1, s2);
            statement = con.createStatement();
        }
        catch(Exception exception)
        {
        
        }       
        try{
         rs=statement.executeQuery("select distinct Titredulivre from ANNONCES where Titredulivre LIKE '"+combo.getSelectedItem().toString() +  "%' order by Titredulivre" );   
          while(rs.next())  {
              titre=rs.getString("Titredulivre");
              vect.addElement(titre);
               }
        }
        catch(SQLException sqlexception)
        {
            System.out.println(sqlexception);
        }


 }
    public static void main(String[] args) {
        new Fenetre();


    }
}
j'espére que tu va comprendre ce code.
merci


 
Commenter la réponse de chat11
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 30 mai 2008 à 13:55
0
Utile
j'ai posé la question de la clause LIKE ici: tu peux suivre les réponses..
Commenter la réponse de cs_Chatbour
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 30 mai 2008 à 19:22
0
Utile
merci chatbour pour la méthode Base ,t'as raison elle élégante que la mienne.
ombitious t'as répondu sur la clause LIKE ,tu as oublie de mettre "%".
je veux savoir s'il y a une méthode en ItemListener qui permet de calculer le nombre de cliques sur un item du combobox pour faire une condition sur ça "si le nombre de clique = =2 alors ajouter l'item séléctionné" dans la liste" peut être cette idée peut régler le probléme.
merci encore une fois et désolé de te fatiguer.
Commenter la réponse de chat11
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 30 mai 2008 à 21:46
0
Utile
Salut,

je pense que cliquer 2 fois sur un Item d'un JComboBox n'est pas tellement ergonomique, pourquoi ne pas faire un bouton valider ?
Commenter la réponse de cs_Chatbour
cs_Chatbour 764 Messages postés jeudi 27 juillet 2006Date d'inscription 6 septembre 2010 Dernière intervention - 30 mai 2008 à 21:48
0
Utile
sinon, tu peux utiliser une variable que tu incrémentes à chaque clique, et que tu testes si elle est égale à 2 ou non...
Commenter la réponse de cs_Chatbour
chat11 58 Messages postés lundi 10 septembre 2007Date d'inscription 12 février 2011 Dernière intervention - 31 mai 2008 à 22:17
0
Utile
merci Chatbour pour tes conseils et ton aide ,j'ai résoulu mon probléme il suffit de faire une condition sur la taille de l'item pour éviter d'ajouter les lettres à la liste :
 String a =(String)combo.getSelectedItem();
           if (a.length()>3){
                    listModel.addElement(combo.getSelectedItem());
                    vect1.add((String)combo.getSelectedItem());
                    System.out.println("vect :"+vect1);
                }

merci et merci 1000 fois chatbour .
Commenter la réponse de chat11

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.