Probléme avec JComboBox

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

Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
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();
        }
    }
}
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
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();
                    }
                }
            }
        });
    }
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
Salut,

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

    }
}
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
Désolé j'ai pas compris ce que tu demandes : si tu veux expliquer d'avantage..
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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.
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

j'ajoute que le JComboBox  est editable=>combo.setEditable(true);
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
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 ;)
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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.
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

j'ai vraiment honte de toi ,le programme est trés long, et j'espére que tu va le comprendre.
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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


 
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
j'ai posé la question de la clause LIKE ici: tu peux suivre les réponses..
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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.
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
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 ?
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
sinon, tu peux utiliser une variable que tu incrémentes à chaque clique, et que tu testes si elle est égale à 2 ou non...
Messages postés
58
Date d'inscription
lundi 10 septembre 2007
Statut
Membre
Dernière intervention
12 février 2011

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 .