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

Autres Java Discussion :

Récupération d'une collection


Sujet :

Autres Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Récupération d'une collection
    Bonjour

    Voila mon souci; j'ai un programme qui sert à récupérer des fichiers XML correspondants à des mairies de villes. Ces fichiers contiennent pleins d'infos sur les mairies mais on ne se contente que du nom, du code insee, du code postal, du téléphone, de l'email et du site internet.

    Dans une interface graphique je dois afficher un annuaire complet (je l'ai fait grâce à une collection) et pouvoir rechercher une mairie par nom.

    Le soucis c'est que je n'arrive pas à prendre en compte la collection que j'ai créé pour l'annuaire afin de faire la recherche. A chaque fois que je fais une recherche (via un champ de saisie puis un clique sur un bouton "search"), pleins d'erreurs s'affichent dans la console.

    Voici quelques bouts de code:

    Dans la classe Collection (qui ajoute les villes à une collection et qui gère la recherche):


    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
    public CollecVille () {
     
        }
     
        private ArrayList<Ville> vil = new ArrayList<Ville>();
     
        public void add(Ville commune) {
            if (!vil.contains(commune)) { //si la collection ne contient pas la commune
                vil.add(commune);   //alors ajouter la commune à la collection
            }
        }  
     
     
        public String searchNom(String name) throws NoSuchElementException{
            Iterator<Ville> iterator = vil.iterator();
            System.out.println("****************");
            while (iterator.hasNext()) {
                Ville commune = iterator.next();
                if (commune.getNom().contains(name)) {
     
                    return commune.toString();
                }
     
            }
            throw new NoSuchElementException("Aucune ville dont le nom contient <<" + name + ">> n'a été trouvée");
     
        }
    Une partie de la classe de l'interface graphique (le bouton4, c'est le bouton "search")


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private CollecVille inter = new CollecVille();
    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
    //Bouton Search par nom
       try {
            bouton4.addActionListener(
                new ActionListener ()
                {
                    public void actionPerformed (ActionEvent e)
                    {
                        JFrame fnom = new JFrame("Recherche par nom"); 
                        fnom.setBounds(0, 210, 465, 600);
                        JTextArea textArea = new JTextArea(inter.searchNom(nameField.getText()));      
                        System.out.println("Nom = " + inter.searchNom(nameField.getText()));   
                        textArea.setBackground(new Color(253,191,183));                
                        textArea.setEditable(false);               
                        fnom.add(textArea);                    
                        fnom.setContentPane(new JScrollPane(textArea));                    
                        fnom.setVisible(true);
                    }
                }
            );
    Le Main dans lequel on créé la collection


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CollecVille inter = new CollecVille();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    v = new Ville(nom,codeInsee,codePostal,telephone,email, url);
    inter.add(v);

    Les messages d'erreur:

    Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException: Aucune ville dont le nom contient <<Recherche par nom>> n'a été trouvée

    at collection.CollecVille.searchNom(CollecVille.java:35)

    at collection.AnnuGUI$4.actionPerformed(AnnuGUI.java:131)

    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

    at java.awt.Component.processMouseEvent(Unknown Source)

    at javax.swing.JComponent.processMouseEvent(Unknown Source)

    at java.awt.Component.processEvent(Unknown Source)

    at java.awt.Container.processEvent(Unknown Source)

    at java.awt.Component.dispatchEventImpl(Unknown Source)

    at java.awt.Container.dispatchEventImpl(Unknown Source)

    at java.awt.Component.dispatchEvent(Unknown Source)

    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

    at java.awt.Container.dispatchEventImpl(Unknown Source)

    at java.awt.Window.dispatchEventImpl(Unknown Source)

    at java.awt.Component.dispatchEvent(Unknown Source)

    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

    at java.awt.EventQueue.access$200(Unknown Source)

    at java.awt.EventQueue$3.run(Unknown Source)

    at java.awt.EventQueue$3.run(Unknown Source)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

    at java.awt.EventQueue$4.run(Unknown Source)

    at java.awt.EventQueue$4.run(Unknown Source)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

    at java.awt.EventQueue.dispatchEvent(Unknown Source)

    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

    at java.awt.EventDispatchThread.run(Unknown Source)

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le message
    Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException: Aucune ville dont le nom contient <<Recherche par nom>> n'a été trouvée
    devrait te mettre sur la voie...

    Ton JTextArea, dans ton dialogue, je suppose que c'est pour afficher le résultat de la recherche d'une ville dont le nom a été tapé dans le champ nameField.

    Or tu initialises ton JTextArea par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    JTextArea textArea = new JTextArea(inter.searchNom(nameField.getText()));
    ...

    Le problème est que quand la recherche ne trouve rien, tu soulèves une exception.
    Ce qui n'est pas si mal, bien que chercher quelque chose qui n’existe pas n'est pas vraiment une erreur (en plus, l'exception choisie n'est pas adéquate : elle signifie qu'il n'y a plus d'éléments à récupérer, et non pas qu'aucun ne correspond), mais ce serait plus simple à gérer en amont de retourner tout simplement null (et de retourner la ville trouvée, le cas échéant, plutôt qu'une String).
    Bref, avec l'exception, la création de textArea va planter lorsque le texte contenu dans nameField ne correspond pas à une ville existante.

    Il faudrait que tu fasses, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    String text;
    try {
       text=inter.searchNom(nameField.getText());
    } catch(NoSuchElementException e) {
       text=e.getMessage();
    }
     
    JTextArea textArea = new JTextArea(text);
    ...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Merci pour cette première réponse. En effet, ça permet au moins de virer toutes les erreurs dans la console.

    En revanche, je n'ai toujours pas accès à la collection que je créé dans le Main
    Du coup, peu import ma recherche, il va constamment m'envoyer le message "Aucune ville dont le nom contient <<...>> n'a été trouvée" dans ma fenêtre de réponses à la recherche.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu fais ta recherche dans la liste de villes représentée par la variable inter : c'est cette liste que tu dois remplir. C'est sûr que si tu remplis une autre variable, ça ne fonctionnera pas.

    Tu dois avoir qu'une seule variable de type CollecVille, et pouvoir y accéder depuis les différentes classes qui en ont besoin. Je n'ai pas toute la structure de ton programme, donc je ne peux te donner de directives précises. Mais on peut imaginer, que si tu la créés dans ton main, tu peux la passer en argument du constructeurs des différentes classes qui en ont besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Program {
     
       public static void main(String[] args) {
     
           CollecVille inter= ...
     
     
           JFrame frame = new AnnuGUI(inter);
     
       }
     
    }
    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
    public class AnnuGUI extends JFrame {
     
        private CollecVille inter;
     
        public AnnuGUI(CollecVille inter) {
     
             ...
             this.inter= inter;
             ...
     
            bouton4.addActionListener(
                new ActionListener ()
                {
                    public void actionPerformed (ActionEvent e)
                    {
                        JFrame fnom = new JFrame("Recherche par nom"); 
                        fnom.setBounds(0, 210, 465, 600);
                        JTextArea textArea = new JTextArea(inter.searchNom(nameField.getText()));      
                        System.out.println("Nom = " + inter.searchNom(nameField.getText()));   
                        textArea.setBackground(new Color(253,191,183));                
                        textArea.setEditable(false);               
                        fnom.add(textArea);                    
                        fnom.setContentPane(new JScrollPane(textArea));                    
                        fnom.setVisible(true);
                    }
                }
            );
     
     
     
    }
    [code
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Pu****
    C'est tout con

    ça marche !

    Dernier petit soucis: lorsque je fais une recherche, il ne m'affiche qu'un résultat, alors que plusieurs sont possibles
    par exemple, je tape "Villiers", il devrait me renvoyer Villers-en-Arthies, Villiers-Adam, Villiers-le-Bel et Villiers-le-Sec. Or il ne me renvoie que Villiers-Adam.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par uluk7 Voir le message
    Dernier petit soucis: lorsque je fais une recherche, il ne m'affiche qu'un résultat, alors que plusieurs sont possibles
    par exemple, je tape "Villiers", il devrait me renvoyer Villers-en-Arthies, Villiers-Adam, Villiers-le-Bel et Villiers-le-Sec. Or il ne me renvoie que Villiers-Adam.
    Bah, ta méthode retourne une valeur, dès qu'elle trouve une ville qui correspond :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public String searchNom(String name) throws NoSuchElementException{
            Iterator<Ville> iterator = vil.iterator();
            System.out.println("****************");
            while (iterator.hasNext()) {
                Ville commune = iterator.next();
                if (commune.getNom().contains(name)) {
     
                    return commune.toString();
                }
     
            }
            throw new NoSuchElementException("Aucune ville dont le nom contient <<" + name + ">> n'a été trouvée");
     
        }
    Si tu veux retourner toutes les villes qui correspondent, il faudra les cumuler dans un résultat, et retourner le résultat à la fin. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public CollecVille () {
     
        }
     
        private List<Ville> villes = new ArrayList<>();
     
        public void add(Ville ville) {
            if (!villes.contains(ville)) { //si la collection ne contient pas la commune
                villes.add(ville);   //alors ajouter la commune à la collection
            }
        }  
     
     
    public List<Ville> searchNom(String name) throws NoSuchElementException{
     
     
            List<Ville> villesTrouvees = new ArrayList<>();
     
            for(Ville ville : villes ) {
                if (ville.getNom().contains(name)) {
     
                    villesTrouvees.add(ville);
     
                }
     
            }
            if ( villesTrouvees.isEmpty() ) {
            throw new NoSuchElementException("Aucune ville dont le nom contient <<" + name + ">> n'a été trouvée");
            }
            return villesTrouvees.
        }
    Et gérer l'affichage :

    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
    bouton4.addActionListener(
                new ActionListener ()
                {
                    public void actionPerformed (ActionEvent e)
                    {
                        JFrame fnom = new JFrame("Recherche par nom"); 
                        fnom.setBounds(0, 210, 465, 600);
                        
                        String resultat;
                        try {
                               List<Ville> villes = inter.searchNom(nameField.getText());
                               StringBuilder sb=new StringBuilder();
                               boolean first=true;
                               for(Ville ville : villes) {
                                       if  (first) first=false; else sb.append("\n");
                                       sb.append(ville);
                               }
                               resultat=sb.toString();
                        } catch( NoSuchElementException e ) {
                               resultat = e.getMessage();
                        }
    
                        JTextArea textArea = new JTextArea(resultat);      
                        textArea.setBackground(new Color(253,191,183));                
                        textArea.setEditable(false);               
                        fnom.add(textArea);                    
                        fnom.setContentPane(new JScrollPane(textArea));                    
                        fnom.setVisible(true);
                    }
                }
            );
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Et bien je te remercie pour ton aide. ça marche super bien.

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

Discussions similaires

  1. [VB6]Valeurs une collection renvoyée par la fonction d'une classe
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 30/03/2004, 11h04
  2. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08
  3. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58
  4. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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