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

Interfaces Graphiques en Java Discussion :

affichage élément d'une liste avec paintComponent, problème


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut affichage élément d'une liste avec paintComponent, problème
    Bonjour,

    Dans le cadre d'un projet, j'ai fais une petite application de jeu, basé sur le fait de pouvoir créer des objets de différents types.

    Mon soucis se pose sur la partie graphique. J'ai un JPanel, Grille, où devront être affiché mes éléments. Ces éléments sont stockés dans la classe Modèle, dans un ArrayList.

    On m'a conseillé de mettre ses éléments également dans la classe Grille, sous forme d'ArrayList, et de redéfinir la méthode paintComponent pour boucler sur les éléments de la liste, et de les afficher.

    Ca donne quelque chose comme ç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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class GrilleCentre extends JPanel{
     
        private ArrayList<Unite> listeCampsUn = new ArrayList<Unite>();
        int xcourant = 0;
        int ycourant = 10;
     
    public void paintComponent(Graphics g) {
            super.paintComponent(g);       
     
            Image img;
            int x=0;
            int y=0;
     
            for(Unite u : listeCampsUn){           
                img = new ImageIcon("image/unite.jpeg").getImage();
                x = (Integer)u.getPropriete("x");
                y = (Integer)u.getPropriete("y");
     
                g2d.drawImage(img, x, y, this);
     
            }      
     
     }
     
    public void ajouterUnite(Unite uni){        
     
            if (listeCampsUn.size()%5 == 0) {
                 ycourant=0;
            }
            listeCampsUn.add(uni);
     
            uni.setPropriete("x", xcourant);
            uni.setPropriete("y", ycourant);            
            repaint();
            ycourant+=33;
     
        }
    Le problème c'est que si j'ajoute un nouvel élément dans la liste, alors que la boucle for du paintComponent est lancé, parfois ça plante.

    Il y a une autre méthode ? (Me dites pas simplement oui ^^)

    Merci !

  2. #2
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,

    Tu pourrais nous indiquer le message d'erreur et la ligne où ça plante?

    Ça devrait théoriquement booster le nombre de réponses.
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
            at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
            at java.util.AbstractList$Itr.next(AbstractList.java:343)
            at Graphismes.GrilleCentre.paintComponent(GrilleCentre.java:67)
            at javax.swing.JComponent.paint(JComponent.java:1017)
    C'est la ligne où commence le for.

    Je comprends l'erreur, c'est normal...Puisque je modifie la liste pendant que je la parcours. Donc je me demandais comment faire autrement

  4. #4
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,

    ConcurrentModificationException, c'est exactement comme tu disais, une itération sur une collection et en même temps ajout d'élément sur cette même collection, c'est ce qui cause le probléme.

    Comme solution, avant d'itérer sur ta collection, tu pourrais en créer une copie, puis itérer sur la copie, ça donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void paintComponent(Graphics g) {
            super.paintComponent(g);       
     
            Image img;
            int x=0;
            int y=0;
            List<Unite> copieListeCampsUn = new ArrayList<Unite>();
            copieListeCampsUn.addAll(listeCampsUn);
            for(Unite u : copieListeCampsUn){ 
            //...
    J'ai parcouru un peu la javadoc, j'ai vu ceci:
    Javadoc dit:
    java.util.concurrent.CopyOnWriteArrayList<E>
    ...
    This array never changes during the lifetime of the iterator, so interference is impossible and the iterator is guaranteed not to throw ConcurrentModificationException.
    C'est drôle, mais en fait c'est à moi de te remercier, je ne savais même pas que ce type de collection existait .

    Donc en théorie il suffirait de changer la déclaration de ta liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private List<Unite> listeCampsUn = new CopyOnWriteArrayList<Unite>();
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et surtout s'arranger pour que la modification de la liste se fasse durant l'EDT, cha serait plus simple

    Sinon y a aussi Collections.synchronizedList() mais apres il faut mettre des semaphores de verrou bien sur.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Ca a l'air de marcher DarkMolo, merci

    Bouye >
    Et surtout s'arranger pour que la modification de la liste se fasse durant l'EDT, cha serait plus simple
    C'est à dire, comment faire ? Merci

Discussions similaires

  1. [Débutant] Afficher les éléments d'une liste avec un sub
    Par stracoma dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/01/2015, 22h07
  2. retirer des éléments d'une liste avec doublons
    Par tanguy.L dans le forum Prolog
    Réponses: 7
    Dernier message: 28/07/2010, 15h44
  3. [AC-2003] comment ajouter un élément dans une liste avec InputBox
    Par spacesheep dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/10/2009, 13h33
  4. supprimer un élément d'une liste avec erase
    Par jane40 dans le forum Débuter
    Réponses: 12
    Dernier message: 24/01/2009, 12h26
  5. Réponses: 12
    Dernier message: 12/03/2007, 16h58

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