Probléme avec JComboBox

Résolu
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011 - 28 mai 2008 à 22:22
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011 - 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

17 réponses

cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
30 mai 2008 à 12:55
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();
        }
    }
}
3
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
30 mai 2008 à 13:44
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();
                    }
                }
            }
        });
    }
3
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
28 mai 2008 à 23:44
Salut,

je ne connais pas l'explication, mais il suffit d'utiliser un ActionListener au lieu d'un ItemListener..
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
28 mai 2008 à 23:51
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();

    }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
29 mai 2008 à 16:52
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
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
29 mai 2008 à 20:49
Désolé j'ai pas compris ce que tu demandes : si tu veux expliquer d'avantage..
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
29 mai 2008 à 22:13
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.
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
29 mai 2008 à 22:19
j'ajoute que le JComboBox  est editable=>combo.setEditable(true);
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
29 mai 2008 à 23:44
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 ;)
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
30 mai 2008 à 00:22
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.
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
30 mai 2008 à 00:33
j'ai vraiment honte de toi ,le programme est trés long, et j'espére que tu va le comprendre.
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
30 mai 2008 à 11:54
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


 
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
30 mai 2008 à 13:55
j'ai posé la question de la clause LIKE ici: tu peux suivre les réponses..
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
30 mai 2008 à 19:22
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.
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
30 mai 2008 à 21:46
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 ?
0
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
30 mai 2008 à 21:48
sinon, tu peux utiliser une variable que tu incrémentes à chaque clique, et que tu testes si elle est égale à 2 ou non...
0
chat11 Messages postés 58 Date d'inscription lundi 10 septembre 2007 Statut Membre Dernière intervention 12 février 2011
31 mai 2008 à 22:17
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 .
0
Rejoignez-nous