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 :

JCombobox changer le contenu du popup


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut JCombobox changer le contenu du popup
    Bonjour,
    j'ai une appli dans laquelle il y a multiple JComboBox.
    Lorsque l'user va dans une de ces JCB (pour JCombobox) il y a un popup qui s'affiche.
    Ce popup prends comme valeur le resultat d'une requette SQL.
    Jusque là pas de probleme..

    Mais je veux que lorsque l'user tappe quelque chose dans la JCB que le contenu du popup change.

    en bidouillant je suis parvenu a quelque chose, mais le resultat ne me plais pas et c'est un code long et loin d'etre optimisé et plus ya des bugs..

    donc je voulais savoir si ya pas quelqu'un qui sait comment je peux faire...


    voici une partie de mon code :


    une fois mon appli chargé, je passe tous mes JCB par cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private static void comboRemplis(JComboBox jcb,String element){
            ComboKey(jcb,element);
            ComboFocus(jcb,element);
        }
    et voici les fonctions :

    /*
    *comboKey permet de rajouter un keyListiner à une combobox
    */
    private static void ComboKey(final JComboBox jcb, final String el){
    final JTextComponent editor=(JTextComponent)jcb.getEditor().getEditorComponent();

    if(loaded)
    editor.setDoubleBuffered(true);

    editor.addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyPressed(java.awt.event.KeyEvent evt) {
    }
    public void keyReleased(java.awt.event.KeyEvent evt) {
    //posi= editor.getCaretPosition();
    if(evt.getKeyCode()==evt.VK_DELETE){
    if(posi!=xbox.length()){
    System.out.println(xbox.substring(0,posi));
    System.out.println(xbox.substring(posi+1));
    xbox=xbox.substring(0,posi)+xbox.substring(posi+1);
    }
    }
    if(evt.getKeyCode()==evt.VK_RIGHT){
    if(posi<xbox.length()){
    posi=posi++;
    change=true;
    }else
    change=false;
    }else if(evt.getKeyCode()==evt.VK_LEFT){
    if(posi>0){
    posi=posi--;
    change=true;
    }
    }
    System.out.println("posi " + posi);
    if(change)
    editor.setCaretPosition(posi);
    jcb.setPopupVisible(true);
    if(evt.getSource()==txtDate.getEditor().getEditorComponent())
    menu.dateNaissanceCompletion(jcb,evt);
    if(evt.getKeyCode()==10){
    jcb.setPopupVisible(false);
    //permet de virer l'espace de fin s'il y en a un
    if(jcb.getSelectedItem().toString().charAt(jcb.getSelectedItem().toString().length()-1)==' ')
    jcb.setSelectedItem(jcb.getSelectedItem().toString().substring(0,jcb.getSelectedItem().toString().length()-1));
    //le traitement continu
    if(evt.getSource()==txtVille.getEditor().getEditorComponent()){
    remplisCP(jcb,txtCP);
    }
    if(evt.getSource()==txtNom.getEditor().getEditorComponent()){
    if(membreExiste()==0){
    existeSaison=false;
    existe=false;
    }
    }
    if(evt.getSource()==txtPrenom.getEditor().getEditorComponent()){
    if(membreExiste()==0){
    existeSaison=false;
    existe=false;
    }
    }
    if(evt.getSource()==txtDate.getEditor().getEditorComponent())
    if(membreExiste()!=0){
    remplirMembreExistant(membreExiste());
    ajout=true;
    //modif=false;
    regl=0;
    if(jrEnfant.isSelected())
    activeZoneTxtResp(true);
    }else{
    existeSaison=false;
    existe=false;
    }
    jcb.transferFocus();
    }
    if(jcb.getItemCount()==0)
    jcb.setPopupVisible(false);
    }
    public void keyTyped(java.awt.event.KeyEvent evt){

    if((evt.getKeyChar()!=evt.VK_LEFT)&&(evt.getKeyChar()!=evt.VK_RIGHT)&&(evt.getKeyChar()!=evt.VK_UP)&&(evt.getKeyChar()!=evt.VK_DOWN)&&(evt.getKeyChar()!=evt.VK_PAGE_UP)&&(evt.getKeyChar()!=evt.VK_PAGE_DOWN)&&(evt.getKeyChar()!=evt.VK_INSERT)&&(evt.getKeyChar()!=evt.VK_END)&&(evt.getKeyChar()!=evt.VK_TAB)&&(evt.getKeyChar()!=evt.VK_BACK_SPACE)&&(evt.getKeyChar()!=evt.VK_DELETE)){

    if(jcb.getEditor().getItem().toString().compareTo("")==0){
    xbox=""+evt.getKeyChar();

    } else{
    if(!change){
    xbox=jcb.getEditor().getItem().toString()+evt.getKeyChar(); //xbox= jcb.getSelectedItem().toString()+ evt.getKeyChar();
    } else{
    xbox=xbox.substring(0,posi)+evt.getKeyChar()+xbox.substring(posi);
    change=true;
    posi++;
    }
    }
    if(xbox.endsWith("\n"))
    xbox=xbox.substring(0,xbox.length()-1);
    } else{
    if((evt.getKeyChar()==evt.VK_BACK_SPACE)&&(xbox.length()>0)){
    if(!change)
    xbox = xbox.substring(0,xbox.length()-1);
    else{
    xbox=xbox.substring(0,posi-1)+xbox.substring(posi);
    posi--;
    if(posi<=0 && xbox.length()==0){
    posi=0;
    change=false;
    xbox="";
    }
    }
    }
    }
    jcb.setSelectedItem(xbox);
    menu.remplisZoneDeroule(jcb,RequetteMembre(el),xbox);
    if(change)
    editor.setCaretPosition(posi);
    evt.consume();
    }
    });
    }
    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
    private static void ComboFocus(final JComboBox jcb,final String e1){
            jcb.getEditor().getEditorComponent().addFocusListener(new java.awt.event.FocusAdapter() {
                public void focusGained(java.awt.event.FocusEvent evt) {
                    String x="";
                    if(jcb.getSelectedItem()!=null)
                        x = jcb.getSelectedItem().toString();
                    xbox=x;
                    String re=RequetteMembre(e1);
                    menu.remplisZoneDeroule(jcb,re,"");
                    jcb.setSelectedItem(x);
                    if((e1.compareToIgnoreCase("tel1")==0)&&ajout){
                        activeZoneTxtResp(true);
                        copieDonnees();
     
                    }
                    if(evt.getSource()==txtPrenom.getEditor().getEditorComponent())
                        txtNom.setSelectedItem(menu.majuscule(txtNom.getSelectedItem().toString()));
                    else if(evt.getSource()==txtPrenomR.getEditor().getEditorComponent())
                        txtNomR.setSelectedItem(menu.majuscule(txtNomR.getSelectedItem().toString()));
                    else if (evt.getSource()==txtDate.getEditor().getEditorComponent())
                        txtPrenom.setSelectedItem(menu.minuscule(txtPrenom.getSelectedItem().toString()));
                    else if (evt.getSource()==txtAdR.getEditor().getEditorComponent())
                        txtPrenomR.setSelectedItem(menu.minuscule(txtPrenomR.getSelectedItem().toString()));
                    else if (evt.getSource()==txtCP.getEditor().getEditorComponent())
                        txtVille.setSelectedItem(menu.majuscule(txtVille.getSelectedItem().toString()));
                    else if (evt.getSource()==txtCPR.getEditor().getEditorComponent())
                        txtVilleR.setSelectedItem(menu.majuscule(txtVilleR.getSelectedItem().toString()));
     
                }
                public void focusLosted(java.awt.event.FocusEvent evt){
     
                }
            });
        }
    comme dit c'est long, mal codé et pas clair (j'ai passé les commentaire et voila le resultat )

    en plus ca merde quand :
    l'user utilise la touche DEL (avec backspace ca fonctionne)
    l'user change le caret avec la souris
    l'user selectionne du texte pour remplacer

    bref total usine à gaz

    si quelqu'un peut m'aider meme si je dois abondonné mon code je suis TOTALEMENT pour !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    en fait pour expliquer mon probleme simplement (car je complique les choses)

    ya des jcombobox dans lesquel l'user entre des données (nom, prenom ...)
    a chaque fois qu'il tappe quelque chose dans ces jcb, une nouvelle requette est envoyé et le resultat est mis dans le popup de la jcb.

    si par ex j'ai 3 gus dans ma base qui s'appelent Muller, Dujardin et Bellevie.

    si l'user va dans la JCB sans rien tapper les 3 sont proposé
    s'il tappe m ya juste tous les nom qui commencent par m qui sont afficher soit Muller
    (ca j'ai reussi a mettre en place, mais comme dit les DEL, et toutes actions de la souris entrainent des bugs ..... )

  3. #3
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par alain57
    comme dit c'est long, mal codé et pas clair (j'ai passé les commentaire et voila le resultat )
    +1

    Première question : Mais pourquoi diable as-tu supprimer les commentaires ?

    Deuxième question : Tu testes plein de touches, dans tous les sens, dans ton code. Avant toute chose est-ce que tu pourrais nous définir clairement ton besoin. Que veux-tu faire, et quand ?

    Ensuite, de quelle façon sont rempli tes JCB ? Est-ce via un tableau ou un vecteur, et donc un accès fixe, ou est-ce via un model ? Si c'est le deuxième cas, ça peut drôlement nous aider... car tu pourras y définir directement tes pop-up...
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  4. #4
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par alain57
    si par ex j'ai 3 gus dans ma base qui s'appelent Muller, Dujardin et Bellevie.

    si l'user va dans la JCB sans rien tapper les 3 sont proposé
    s'il tappe m ya juste tous les nom qui commencent par m qui sont afficher soit Muller
    Mais dans ce cas, nul besoin de passer par une requête systématique auprès de ta base de données ! Tu as déjà toutes les données sur place, à quoi bon aller les chercher à nouveau.
    Ce qui tu fais n'est rien d'autre qu'un filtre en regardant ce qui est déjà tappé, sur le contenu actuel de ta JCB. Je suis quasiment sur que c'est une implémentation de la JCB qui existe déjà...
    Recherche sur le forum (j'ai pas trop le temps là) et surtout sur le site de Sun. Je suis presque persuaé que tu vas trouver ce que tu cherches dans la partie How to sur les combo box de Sun.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  5. #5
    Membre à l'essai
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Regarde du côté de SwingX, il y a un composant combobox qui gère l'autocompletion, peut être il y en a-t-il un autre qui gère celà ...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    en fait mes JCB sont remplis automatiquement par resultat de requette
    tant que resultat
    jcb.addItem(contenu);

    ensuite j'ai par ex le nom dans une JCb et le prenom dans l'autre
    et donc si ya plusieurs Muller et quand dans nom ya muller, bah dans prenom il ne proposera que les gents qui s'appellent muller.

    en fait j'ai une requette qui emblobe tout 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
     
    /*
         *permet de donner la requette MYSQL
         */
        public static String RequetteMembre(String element){
            String t="";
            if(!element.startsWith("Resp")){
                if(element.compareTo("ville")!=0)
                    t="select DISTINCT "+ element + " from membres where nom like '"+
                            menu.ecriture(txtNom.getSelectedItem().toString())+"%' and adNumRue like '" + menu.ecriture(txtAd.getSelectedItem().toString())+"%' and adCP like '"+
                            menu.ecriture(txtCP.getSelectedItem().toString())+"%' and tel1 like '"+ menu.ecriture(txtTel2.getSelectedItem().toString())+"%' and tel2 like '" +
                            menu.ecriture(txtTel1.getSelectedItem().toString())+"%' and tel3 like '"+ menu.ecriture(txtTel3.getSelectedItem().toString())+"%' and mail like '"+
                            menu.ecriture(txtMail.getSelectedItem().toString())+"%' order by " + element;
                else
                    if(txtVille.getSelectedItem().toString().compareToIgnoreCase("")!=0)
                        t="select DISTINCT ville from membres where ville like '"+
                                menu.ecriture(txtVille.getSelectedItem().toString())+"%' ORDER BY `ville` ASC";
                    else
                        t="SELECT DISTINCT ville FROM membres ORDER BY ville ASC";
     
                System.out.println(t);
            } else{
                element=element.substring(4,element.length());
                if(element.compareToIgnoreCase("nomRC")==0)
                    t="select DISTINCT nomRC from resp where nomRC like '" + menu.ecriture(txtNomRC.getSelectedItem().toString()) +"%' ORDER BY nomRC ASC";
                else if (element.compareToIgnoreCase("ville")==0)
                    t="select DISTINCT ville from membres where ville like '"+menu.ecriture(txtVilleR.getSelectedItem().toString())+"%' ORDER BY ville ASC";
                else if(element.compareToIgnoreCase("emplMere")==0)
                    t="select DISTINCT emplMere from resp where emplMere like '"+menu.ecriture(txtEmpl1R.getSelectedItem().toString())+"%' ORDER BY emplMere";
                else if(element.compareToIgnoreCase("emplPere")==0)
                    t="select DISTINCT emplPere from resp where emplPere like '"+menu.ecriture(txtEmpl2R.getSelectedItem().toString())+"%' ORDER BY emplPere";
                else
                    t="Select DISTINCT " + element + " from resp where nom like '"+
                            menu.ecriture(txtNomR.getSelectedItem().toString())+"%' and prenom like '" + menu.ecriture(txtPrenomR.getSelectedItem().toString()) + "%' and ad like '" + menu.ecriture(txtAdR.getSelectedItem().toString())+"%' and cp like '"+
                            menu.ecriture(txtCPR.getSelectedItem().toString())+"%' and mail like '"+
                            menu.ecriture(txtMailR.getSelectedItem().toString())+"%' and numCaf like '" +
                            menu.ecriture(txtCafR.getSelectedItem().toString())+"%' and emplMere like '" +
                            menu.ecriture(txtEmpl1R.getSelectedItem().toString())+"%' and emplPere like '" +
                            menu.ecriture(txtEmpl2R.getSelectedItem().toString())+"%' and numRC like '" +
                            menu.ecriture(txtNumRC.getSelectedItem().toString())+"%' and nomRC like '"+
                            menu.ecriture(txtNomRC.getSelectedItem().toString())+"%' ORDER BY " + element;
     
            }
            return t;
        }
    donc a chaque changement que ce soit au nom, au prenom ou a autre chose ya requetteMembre(element) qui est lancé

    le resultat est de cette forme là :
    select DISTINCT ELEMENT from membres where nom like '%' and adNumRue like '%' and adCP like '%' and tel1 like '%' and tel2 like '%' and tel3 like '%' and mail like '%' order by ELEMENT

    donc c'est vrai qu'un filtre juste pour filtré une JCB en fonction des lettres c'est bon, mais ici je filtre toutes mes JCB (une dixaine) en fonction ET des lettres tappé, et du contenu des autres ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par leminipouce
    +1

    Première question : Mais pourquoi diable as-tu supprimer les commentaires ?

    Deuxième question : Tu testes plein de touches, dans tous les sens, dans ton code. Avant toute chose est-ce que tu pourrais nous définir clairement ton besoin. Que veux-tu faire, et quand ?

    Ensuite, de quelle façon sont rempli tes JCB ? Est-ce via un tableau ou un vecteur, et donc un accès fixe, ou est-ce via un model ? Si c'est le deuxième cas, ça peut drôlement nous aider... car tu pourras y définir directement tes pop-up...
    1: je les ai pas supprimer, je les ai pas mis au départ, apres par la suite j'ai commencer à en rajouter, mais comment dire ya des choses que je sais plus pourquoi j'ai mis

    2:
    j'ai besoin que lorsqu'on tappe m dans le JCB nom, qu'il m'affiche tous les NOM qui commencent par M
    ensuite dans les autres JCB (comme prenom par ex) il doit m'afficher que les prenom qui ont comme nom ce qu'il y a dans NOM

    et ainsi de suite, le JCB suivant affichera uniquement la personne qui correspond aux critères précédants

    moi j'ai fait passé ca par une requette généré automatiquement peut importe l'element, mais je l'avoue c'est peut etre la solution qui nécessite le moins de ligne, mais pour MySQL c'est pas bon ...
    Donc si ya des sollutions moins gores que ce que j'ai mis en place je suis tout à l'ecoute

    je veux bien faire comme proposé à savoir prendre tous les nom les mettre dans la JCB nom et les filtré suivant le contenu
    et ensuite prendre tous les prenom qui correspondent au nom et les filtré ....

    mais je veux surtout que ca fonctionne et filtre bien, peut importe si on change la position du caret à la souris ou au clavier ...


    Je suis conscient que mon code est mortel c'est pourquoi je n'est rien contre pour recommencer à zero cette partie de mon appli (pas tout hein) le reste j'ai tout bien commenté comme il faut

  8. #8
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    D'où l'intérêt d'utiliser un modèle...
    J'insiste, mais les accès à une BD, c'est long, voir même très long. Si elle n'est pas hébergée sur le même poste... ça va en plus dépendre de ton accès au réseau, et peut le surcharger si tu as beaucoup d'utilisateurs !
    Il faut prescrire les accès multiple à une BD. (je veux dire quand on cherche à toujours récupérer les mêmes infos.).

    Je te redirige vers les How to de Sun.

    Typiquement dans ton genre de cas, je crée un objet pour chacun des enregistrements de ma table. Donc en un accès à ma base j'enregistre tous les éléments dont j'ai besoin.
    Ensuite je fais des getters grâce auquel je rempli mes différents modèles sur lesquels sont basées mes JCB.
    Enfin, à chaque modification de mes JCB, je mets à jour une/des variables de classe dans la classe qui contient mes données de BD. Si mes getters sont bien fait, ils prennent en compte le contenu de ces variables (accès directe aux variables de classe depuis n'importe quelle instance de cette classe) pour ajuster la liste des éléments qu'ils retournent aux modèles.

    Et voilà le tour est jouer, et je n'ai qu'un seul accès à ma BD. Les performances sont bien meilleures, et la maintenance bien plus aisée.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  9. #9
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par alain57
    j'ai besoin que lorsqu'on tappe m dans le JCB nom, qu'il m'affiche tous les NOM qui commencent par M
    ensuite dans les autres JCB (comme prenom par ex) il doit m'afficher que les prenom qui ont comme nom ce qu'il y a dans NOM
    Je n'avais as vu ce post quand j'ai commencé le mien. Il n'empêche.
    Juste une petite précision, dans ce cas, à ta place, je laisserai tous les champs vide en attendant la sélection complète du nom, et ainsi de suite.

    En fait, tout dépend de la quantité de données que tu as. Si la taille est suffisament petite, vu les temps d'accès à une BD, il sera plus interressant de ramener toutes les données d'un coup et de les traiter comme je l'ai dit.
    Si la base devait être trop importante, alors je te conseille de faire une requête spécifique pour chaque champ, après validation du premier.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    leminipouce as tu un petit exemple histoire de voir comment ca fonctionne sans devoir trop chercher (je sais je suis un grand fénéant)

    merci pour vos réponses à tous

  11. #11
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Euh... non pas là, non !

    Regarde un peu comment marche les models et si tu galère je veux bien t'aider dans l'élaboration de la solution...
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    bah j'ai continuer seul mais j'ai un soucis
    j'ai toujours une exception à la con que j'ai jamais eut jusque la
    et le pire c'est que je trouve pas de sollution, d'habitude quand j'ai une exception c'est du à une erreur ou un oubli d'initialisation mais la..

    en premier je sais pas si c'est un bug ou un manque à java, mais pour avoir des keylistener ou caretlistener sur une JComboBox bah faut triché pour l'avoir.

    Moi je triche comme ca :
    JTextComponent editor=(JTextComponent)jcb.getEditor().getEditorComponent();

    histoire de transformé l'editeur de ma JCB en quelque chose ou je peux avoir les bon listener.

    voila mon listener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    editor.addCaretListener(new javax.swing.event.CaretListener() {
                    public void caretUpdate(CaretEvent e) {
                        if(!ajNom)//si on est en train d'ajouter ou de supprimer des items ajNom=true, donc on fait rien
                        if(e.getSource()==txtNom.getEditor().getEditorComponent()){
                            selectNom();
                            if(txtNom.getItemCount()>0)
                                txtNom.showPopup();
                            else
                                txtNom.hidePopup();
                    }
                    }
                });
    voila ma fonction
    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
     private static void selectNom(){
            try{
                ajNom=true; //on ajoute et supprime des items dans cette fonction, il faut donc eviter que ca lance des evenement
                //le model
                ComboBoxModel model;
                //ce que contient le jcb à l'evenement
                String contient=txtNom.getSelectedItem().toString();
                //si c'est vide on affiche tous les NOM de la base
                if(contient.compareTo("")==0){
                String MySQL="select distinct nom from membres";
                menu.rs=menu.stm.executeQuery(MySQL);
                vNomJCB.removeAllElements();
                while(menu.rs.next()){
                    vNomJCB.addElement(menu.rs.getString("nom"));
                }
                //on créer le model
                model = new DefaultComboBoxModel(vNomJCB);
                }else{
                    //sinon on ajoute tous les nom qui commencent par ce qu'on a tapper
                    //on créer le vecteur qui contiendra ces nom
                    Vector vNomJCB2=new Vector(5,5);
                    //on parcours le vecteur vNomJCB qui contient TOUS les nom et si ca correspond on ajoute l'element dans le vecteur vNomJCB2
                    for(int a=0;a<vNomJCB.size();a++){
                    if(vNomJCB.elementAt(a).toString().toLowerCase().startsWith(contient.toLowerCase()))
                        vNomJCB2.addElement(vNomJCB.elementAt(a));
     
                    }
                model = new DefaultComboBoxModel(vNomJCB2);    
                }
                //on vide txtNom
                txtNom.removeAllItems();
                //on applique le model
                txtNom.setModel(model);
                ajNom=false;//on a fini la fonction, on permet donc de recevoir des evenements
            }catch(Exception ex){
                System.out.println("erreur dans select nom");
                ex.printStackTrace();
            }
        }
    et bien sur ya aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static boolean ajNom=false;
    donc normalement je veux que :
    1: si j'ajoute ou supprime des elements de mon JCB qu'il n'y a aucun event. (grace au boolean ajNOM)
    2: si je caret bouge (donc qu'on tappe ) que ca met à jour la JCB de facon suivante :

    A : ya rien de tappé, on charge tous les NOMS
    B: ya quelque chose de tappé, on verifie si ya des elements qui commencent pareil et on affiche QUE ces elements

    normalement mon code est logique et bon
    mais j'ai une jolie exception
    java.lang.IllegalStateException: Attempt to mutate in notification
    elle se fait sur :
    txtNom.removeAllItems();
    et sur
    txtNom.setModel(model);

  13. #13
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(e.getSource().equals(txtNom.getEditor().getEditorComponent())){
    En aucun cas il ne te faut utiliser un modèle de la sorte... !!! La il est totalement inutile. Et il te faut construire ton JComboBox sur ce model.

    Voilà, vite fait, ça donnerait déjà plus quelque chose qui ressemble à ça :
    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
    private DefaultComboBoxModel jcbModel = new DefaultComboBoxModel();
     
    //Quelque part, là ou tu crées tu JComboBox
        vNomJCB = new JcomboBox(jcbModel);
     
    private static void selectNom(){
            try{
                ajNom=true; //on ajoute et supprime des items dans cette fonction, il faut donc eviter que ca lance des evenement
     
                //ce que contient le jcb à l'evenement
                String contient=txtNom.getSelectedItem().toString();
     
                //si c'est vide on affiche tous les NOM de la base
                if(contient.compareTo("")==0){
                    String MySQL="select distinct nom from membres";
                    menu.rs=menu.stm.executeQuery(MySQL);
                    jcbModel.removeAllElements();
                    while(menu.rs.next()){
                        jcbModel.addElement(menu.rs.getString("nom"));
                    }
                    //...
                }
            }
    }
    En gros l'idée c'est que tu gères ton modèle de données, et la JCB se met à jour en regarant ce modèle.
    Perso, j'aurais créé une classe Personne dans laquelle je stoquerais mes personnes au sortir de la base de données, puis je rempli mes différents modèles de données en puissant dans ma liste de personnes celles que je vexu voir apparaître.
    Autre solution, je stoque toutes mes personnes dans mon modèle de donné que je redéfini afin qu'il ne retourne à ma JCB (getElementAt(int i)) que les données qui respecte le filtre de données actuellement en place.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  14. #14
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Voici un petit bout de code, vite fait et non testé (j'ai pas du tout le temps de mettre en place une base Oracle pour ça...).
    Il te suffit d'appeler updateNomsModel() à chaque fois que cela te paraît nécessaire. Et derrière, je crois de mémoire qu'il faut demander un rafraichissement de ta JComboBox. Je te laisse chercher un peu la façon de faire...
    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
    //Quelque part, là ou tu déclares ta JComboBox
    private DefaultComboBoxModel modelJCBNoms = new DefaultComboBoxModel(); //Modèle pour le JCB des noms
    private DefaultComboBoxModel modelJCBPrenoms = new DefaultComboBoxModel(); //Modèle pour le JCB des prénoms
    private JComboBox jcbNoms = new JComboBox(modelJCBNoms);
    private JComboBox jcbPrenoms = new JComboBox(modelJCBPrenoms);
    private ArrayList listPersonne = new ArrayList();
     
    public class Personne{
        private String nom = null;
        private String prenom = null;
        //...
     
        public Personne(){}
     
        public Personne(String pNom, String pPrenom){
            this();
            nom = pNom;
            prenom = pPrenom;
        }
     
        public String getNom(){
            return nom;
        }
     
        public void setNom(String pNom){
            nom = pNom;
        }
     
        //...
    }
     
    private static void getPersonnesFromDB(){
        String mySQLQuery="select distinct nom from membres";
        menu.rs=menu.stm.executeQuery(mySQLQuery);
        //Au passage, je te conseille de mettre "nom" et "prenom" dans des variables globales, ça t'autorisera plus
        //de souplesse et surtout une maintenance beaucoup plus facile si jamais un champ est renommé dans la BD
        //Ceci devrait d'ailleurs avec ta requête mySQLQuery elle-même
        while(menu.rs.next()){
            listPersonne.add(new Personne(menu.rs.getString("nom"), menu.rs.getString("prenom")));
        }
    }
     
    /**
     *  Cette méthode met à jour le contenu de la JCB des noms en fonction du contenu actuel (saisi par l'utilisateur)
     *  ainsi que le contenu des JCB qui en découle...
     */    
    private void updateNomsModel(String selection){
        //On vide les modèles afin de les re-remplir.
        //On pourrait aussi aussi se contenter de supprimer les éléments qui ne doivent plus y apparaître
        //Avec comme problème d'obliger à une gestion différente dans le cas ou il faut re-remplir la JCB
        //lors de la réduction de la saisie faite par l'utilisateur.
        modelJCBNoms.removeAllElements();
        modelJCBPrenoms.removeAllElemets();
        //...
     
        Personne personneCourante = null;
        //On parcours la liste des personnes afin de savoir lesquelles doivent apparaître dans les JCB
        for(int i=0; i<listPersonne.size(); i++){   //Voir avec un for-each si tu es en 1.5 ou +
            personneCourante = (Personne)listPersonne.get(i);
            //Et on ne rempli les JCB qu'avec les personnes correspondantes aux critères "établis" par l'utilisateur
            if(personneCourante.getNom().startsWith(nomSaisiParUtilisateur)){
                modelJCBNoms.addElement(personneCourante.getNom());
                modelJCBPrenoms.addElement(personneCourante.getPrenom());
                //...
            }
        }
    }
    [EDIT] En regardan ton post, j'ai vu une erreur dans mon code. C'est modifié... (listPersonne.add(new Personne(...))
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    merci pour ton aide, je vais voir ce que ca donne ce soir, là je fais d'autres mises à jours plus prioritaires dans mon appli

    Encore merci

Discussions similaires

  1. [JComboBox] Mmise à jour contenu
    Par java_math dans le forum Composants
    Réponses: 4
    Dernier message: 16/07/2008, 18h27
  2. lire et changer le contenu d'texte.txt avec javascript?!
    Par Squalli dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/08/2005, 18h20
  3. [JTable] Changer le contenu d'une seule cellule
    Par terminagroo dans le forum Composants
    Réponses: 7
    Dernier message: 05/07/2005, 13h50
  4. TD changer le contenu
    Par C.M dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/02/2005, 13h51
  5. [Swing] Changer le contenu d'un Container via un menu
    Par TheSeb dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 07/12/2004, 23h07

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