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

Agents de placement/Fenêtres Java Discussion :

Problème de mise a jour JFrame par une liste de JPanel


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Problème de mise a jour JFrame par une liste de JPanel
    Bonjour tout le monde!

    Habituellement je ne demande pas d'aide sur les forum de peur de déranger et puis j'arrive généralement à trouver la solution par moi même.
    Cependant, je tombe sur un cas qui pourtant parrait simple mais que je n'arrive pas à régler.

    contexte: j'ai créé un petit JFrame qui affiche la position de villages.

    mon Main créer une carte (JFrame) qui a 2 méthodes:
    - updateCarte : supprime tout le montenu de son JPanel container et le réinitialise ( couleur...) et fini par via une liste d'objet JPanel (mes villages) itérer l'insersion de mes points via laméthode add() de mon JPanel container )
    - newVillageToList : ajoute un village à la liste des villages et fait appel à la méthode updateCarte()

    Les villages sont instanciers dans mon main (Village qui extends JPanel) et via le constructeur de Village, la méthode newVillageToList est appelé ce qui rajoute ce village a la liste des villages du JFrame et met à jour par la même occasion le container de celle ci.

    dans cet exemple, j'instancie 2 Villages. et mon problème est que le SYSOUT ( présent dans la méthode paintComponent de la classe Village) apparaît en double...
    De plus, le background color du JPanel container du JFrame n'apparait pas!!

    si quelqu'un aurait une idée svp!

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    package models;
     
    import java.awt.Color;
    import java.awt.Graphics;
     
    import javax.swing.JPanel;
     
    public class Village extends JPanel {
     
    	private static final long serialVersionUID = 1L;
    	private String nom;
    	private Joueur proprietaire;
    	private int posX, posY;
    	private int population;
    	private Carte carte;
     
    	public Village(String nom, Joueur proprio, int pX, int pY,Carte carte) {
     
    		this.nom = nom;
    		this.proprietaire = proprio;
    		this.posX = pX;
    		this.posY = pY;
    		this.population = 8;
    		this.carte = carte;
    		carte.newVillageToList(this);
    		proprietaire.getVillageList().add(this);
     
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
     
    		System.out.println(this.nom + " : j'apparai sur la carte");
    		int taille = 0;
     
    		if (population < 50)
    			taille = 8;
     
    		if (population >= 50 && population < 100)
    			taille = 12;
     
    		if (population >= 100)
    			taille = 16;
     
    		g.setColor(Color.RED);
    		g.fillOval(posX, posY, taille, taille);
     
    //		try {
    //			Thread.sleep(2);
    //		} catch (InterruptedException ie) {
    //			ie.printStackTrace();
    //		}
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public Joueur getProprietaire() {
    		return proprietaire;
    	}
     
    	public void setProprietaire(Joueur proprietaire) {
    		this.proprietaire = proprietaire;
    	}
     
    	public int getPosX() {
    		return posX;
    	}
     
    	public void setPosX(int posX) {
    		this.posX = posX;
    	}
     
    	public int getPosY() {
    		return posY;
    	}
     
    	public void setPosY(int posY) {
    		this.posY = posY;
    	}
     
    	public int getPopulation() {
    		return population;
    	}
     
    	public void setPopulation(int population) {
    		this.population = population;
    	}
     
    	public Carte getCarte() {
    		return carte;
    	}
     
    	public void setCarte(Carte carte) {
    		this.carte = carte;
    	}
     
     
     
     
     
    }
    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
     
    package models;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Carte extends JFrame {
     
    	private static final long serialVersionUID = 1L;
    	private JPanel container = new JPanel();
    	List <Village> villageListe= new ArrayList<Village>();
     
    	public Carte() {
    		// JFrame
    		this.setTitle("carte");
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.setResizable(false);
    		this.setSize(500, 500);
     
     
    		//container
    		container.setBackground(Color.GREEN);
    		container.setLayout(new BorderLayout());
     
    		this.setContentPane(container);
    		this.setVisible(true);
     
    	}
     
    	public void updateCarte() {
     
    		container.removeAll();
    		container.setBackground(Color.GREEN);
    		container.setLayout(new BorderLayout());
     
    		for (Village v : villageListe) {
    			container.add(v, BorderLayout.CENTER);
    		}
    		this.setContentPane(container);
     
    	}
     
    	public void newVillageToList(Village village) {
    		this.villageListe.add(village);
    		updateCarte();
    	}
     
     
     
    }
    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
    package models;
     
    import java.util.List;
     
     
    public class Main {
     
    	public static void main(String[] args) {
     
    		Carte carte = new Carte();
     
    		Joueur joueur1 = new Joueur("Vincent");
    		Village v1 = new Village("eden", joueur1, 200, 200,carte);
    		Village v2 = new Village("paris", joueur1, 50, 50,carte);
    		v1.setPopulation(50);
     
    		List<Village> liste = joueur1.getVillageList();
     
    		for (Village v : liste) {
    			System.out.println("Je suis le village "+v.getNom()+". J'appartiens au joueur "+v.getProprietaire().getNom());
     
    		}
     
    	}
    }
    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
     
    package models;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Joueur {
     
    	String nom;
    	List<Village> villageList= new ArrayList<Village>();
     
    	public Joueur() {
    	}
     
    	public Joueur(String nom) {
    		this.nom = nom;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public List<Village> getVillageList() {
    		return villageList;
    	}
     
    	public void setVillageList(List<Village> villageList) {
    		this.villageList = villageList;
    	}
     
    }

  2. #2
    Membre expérimenté Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 795
    Points : 1 685
    Points
    1 685
    Par défaut
    J'ai pas vérifié mais vérifie la valeur de la méthode JFrame.getIgnoreRepaint().
    Il me semble que sur une JFrame par défaut c'est true.
    Pensez à marquer vos tickets comme résolus.
    Pensez aussi aux pour les réponses pertinantes

    Quand une discution est résolue depuis un moment pour revenir dessus, il est mieux d'en crée une nouvelle avec un lien vers l'autre car :
    • Elle sera en haut du forum, elle sera donc plus visible
    • Une discussion résolue, on ne passe pas dessus pour aider, on passe dessus si on a le même problème
    • Tu demandes surement à tes clients de faire le même

  3. #3
    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,


    1. Citation Envoyé par ginius Voir le message
      dans cet exemple, j'instancie 2 Villages. et mon problème est que le SYSOUT ( présent dans la méthode paintComponent de la classe Village) apparaît en double...
      Rien d'étonnant, les deux instances de classe Village sont ajoutés à un container, successivement, donc leur méthode paintComponent invoquée (il y a plein d'autres conditions pour que ça arrive ou pour que ça n'arrive pas (comme par exemple l'état "visible"), mais on y est pas à priori). Donc rien d'étonnant à ce que le "sysout apparaisse deux fois" comme tu dis, une fois lors de l'ajout du premier et une seconde lors de l'ajout du second (qui ajoute le premier et le second d'ailleurs). Le premier composants peu avoir été layouté, ou pas, au moment du rafraîchissement graphique, selon l’ordonnancement des threads (voir plus loin, cette histoire de threads) et la vitesse d'exécution des ordres d'ajouts.
      Le processus est un peu plus compliqué que ça (voir méthode updateCarte), mais il y a peu de repaint implicites dans ton code, ce qui doit expliquer pourquoi il n'y a que 2 sysout. Il faudrait étudier plus en détail tous les mécanismes pour confirmer, mais ça n'a que peu d'intérêt en fait.
    2. En revanche :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      container.setLayout(new BorderLayout());
       
      		for (Village v : villageListe) {
      			container.add(v, BorderLayout.CENTER);
      		}
      Un BorderLayout est un composant qui définit 5 zones, dont une au centre. Il ne doit y avoir qu'un seul composant dans chaque zone. Ici, tu en ajoutes plusieurs (2 villages, donc 2 composants). Le premier village est donc ajouté au container et géré par le BorderLayout. Puis le second village est ajouté, le deux villages s'y trouvent donc toujours, mais seul le second est géré par le BorderLayout. C'est déjà un problème. Il va falloir choisir un autre type de layout manager, selon la façon dont les différents villages sont censés être agencés.
    3. Et un composant situé au centre d'un BorderLayout, qui n'a qu'un composant, s'étend forcément sur l'ensemble du container. Peu de chance qu'on voit la couleur du panel du fond de fenêtre.
      Cependant, on pourrait se dire que comme il manque l'appel de super.paintComponent dans paintComponent de Village, le composant est sûrement transparent et laisse voir le fond de la JFrame. Ce n'est pas le cas : tout ce que ça fait de supprimer le super.paintComponent, c'est de supprimer le mécanisme standard du dessin du fond du JPanel, donc ça provoque des comportements imprévisibles et erratiques. En particulier, comme le contexte graphique (l'instance de Graphics) est recyclée en Swing, tu peux avoir des reliquats de dessins d'autres composants dans le fond, qui ne seront pas nettoyées (donc visibles dans le fond de ton panel). Il faut laisser Swing faire ce qu'il a à faire et utiliser les différentes méthodes présentent pour contrôler l'affichage du fond (par exemple, setOpaque(false) pour rendre un panel transparent, etc).
    4. Attention, Swing utilise son propre thread (Event Dispatch Thread, ou EDT), pour mettre à jour l'affichage, ou réagir aux événements (sauf quelques exceptions, lorsqu'il ne s'agit pas directement de processus liés à l'UI).
      Il faut donc veiller, dès lors qu'un composants est visible, à modifier l'état des composants (donc y compris ajouter ou supprimer des composants, faire le layout, etc), dans le thread de Swing (voir SwingUtilities.invokeLater() en particulier), sinon on aura des comportements difficiles prévisibles, voire des exceptions (appels concurrents).
      Pour éviter les surprises et comportements aléatoires, respecter le fonctionnement de l'EDT.
    5. Lorsqu'on modifie les composants d'une interface graphique Swing affichée (visible), il faut veiller à avertir Swing qu'il doit refaire ses calculs de layout (dans certains cas, il pourra le faire (par exemple si on change les bounds d'une fenêtre), mais la plupart du temps, pour éviter de le faire à tout bout de champ (vu que ça peut être long), il laisse le soin au codeur qui modifie le contenu du container de prévenir lorsque le contenu du conteneur est prêt), et, éventuellement, dans certains cas (comme par exemple, lorsqu'on dessine soit-même dans le fond d'un composant), redessinée. Voir les méthodes revalidate/invalidate/validate pour la partie layout et repaint pour la partie redessin.
    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.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci a toi joel.drigo pour cette réponse très complète. Je vais me pencher sur tout ça pour régler ce problème.

    Je pensais sinon pour cette histoire de X JPanel dans le même container de faire autrement. C'est à dire:

    Je créer une seule classe qui hérite de JPanel ( appelé LesVillages par exemple) et c'est dans sa méthode PaintComponent via un foreach de la liste des joueurs et de leurs villages) que je fait un g.fillOval(posX, posY, taille, taille);

    Donc au final cet objet Jpanel aura donc plusieurs points et c'est seulement après ça que j'insert cet unique JPanel dans le container de la JFrame à la position CENTER de mon borderLayout.

    Je pense que c'est la façon de procéder la plus propre.

    Au final ma Classe village ne sera qu'une simple classe avec ses attributs (X, Y) , ma classe Joueur qui aura une liste de Villages, ma classe LesVillages qui aura un tableau de joueurs et donc de tous les villages).

  5. #5
    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 ginius Voir le message
    Je créer une seule classe qui hérite de JPanel ( appelé LesVillages par exemple) et c'est dans sa méthode PaintComponent via un foreach de la liste des joueurs et de leurs villages) que je fait un g.fillOval(posX, posY, taille, taille);
    Oui, c'est une bonne solution surtout si les villages ont une position quelconque plus difficile à traiter avec un layout manager standard (ou il faudra faire ton propre lm). Éventuellement, tu peux faire le rendu dans la classe village. Ce qui te laisse plus de latitude ensuite si tu dois afficher autre chose que des villages, ou des villages de façon différentes. Tu introduis une interface ou une abstraction, la classe Villages devient une classe Carte, et au lieu d'une liste de Village, tu as une liste de "machin à afficher", donc certains peuvent éventuellement bouger (utiliser un SwingPropertyChangeSupport pour traiter le rafraîchissement automatique.

    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
    public class Village {
       private final int x;
       private final int y;
       private final int taille;
       private final Color color;
     
       public Village(int x, int y, int taille, Color color) {
              this.x=x;
              this.y=y;
              this.taille=taille;
              this.color=color;
       }
     
       public void render(Graphics g) {
              g.setColor(color);
              g.fillOval(x-taille/2, y-taille/2, taille, taille); 
       }
     
    }
    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
    public class Villages extends JPanel {
     
     
         private final Set<Village> villages = new HashSet<>();
     
         public Villages() {
               setBackground(Color.GREEN);
         }
     
         // attention appeler cette méthode da
         public void addVillage(Village village) {
               villages.add(Objects.requireNonNull(village)); 
               repaint();
         }
     
         protected void paintComponent(Graphics g) {
               super.paintComponent(g);
               villages.forEach(village-> village.render(g));
         } 
     
    }
    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.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut remerciement
    Un grand merci pour l'aide que tu m'as apporté, j'ai eu seulement le temps de m'y penché il y a 30 minutes et c'est juste le temps qu'il m'a fallut pour tester la ligne de conduite que je voulais tenir avec ton aide et ça marche du feu de dieux!!!!

    plus de doublon sur la console et bien entendu la méthode du Thread de swing affiche seulement après le SYSOUT de celle du main ( utilisé pour le contrôle des insersions)

    Nom : Sans titre.png
Affichages : 292
Taille : 3,4 Ko

    Nom : Sans titre.png
Affichages : 306
Taille : 12,1 Ko

    Au final, c'est l'objet village qui instancié, fait appel via son constructeur à la méthode de l'objet Villages (addVillage)qui en ajoutant un village, refait un repaint et par la suite grâce à sa méthode paintComponent l'affichage de tous les villages du set .
    Pour ceux qui aimeraient avoir le code final:

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    import java.awt.Color;
    import java.awt.Graphics;
     
    public class Village {
     
    	private String nom;
    	private final Joueur proprietaire;
    	private final int posX, posY;
    	private int population;
    	private Villages villages;
     
    	public Village(String nom, Joueur proprio, int pX, int pY, Villages villages) {
     
    		this.nom = nom;
    		this.proprietaire = proprio;
    		this.posX = pX;
    		this.posY = pY;
    		this.population = 8;
    		this.villages = villages;
    		proprietaire.getVillageList().add(this);
    		villages.addVillage(this);
     
     
    	}
     
    	public void render(Graphics g) {
    		System.out.println(this.nom + " : j'apparai sur la carte");
    		int taille = 0;
     
    		if (population < 50)
    			taille = 8;
     
    		if (population >= 50 && population < 100)
    			taille = 12;
     
    		if (population >= 100)
    			taille = 16;
     
    		g.setColor(Color.RED);
    		g.fillOval(posX, posY, taille, taille);
     
    	}
     
     
     
     
    	public Villages getVillages() {
    		return villages;
    	}
     
    	public void setVillages(Villages villages) {
    		this.villages = villages;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public Joueur getProprietaire() {
    		return proprietaire;
    	}
     
    	public int getPosX() {
    		return posX;
    	}
     
    	public int getPosY() {
    		return posY;
    	}
     
    	public int getPopulation() {
    		return population;
    	}
     
    	public void setPopulation(int population) {
    		this.population = population;
    	}
     
    }
    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
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.HashSet;
    import java.util.Objects;
    import java.util.Set;
     
    import javax.swing.JPanel;
     
    public class Villages extends JPanel {
     
    	private static final long serialVersionUID = 1L;
     
    	private final Set<Village> villages = new HashSet<>();
     
        public Villages() {
              setBackground(Color.GREEN);
        }
     
        // attention appeler cette méthode da
        public void addVillage(Village village) {
              villages.add(Objects.requireNonNull(village)); 
              repaint();
        }
     
        protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              villages.forEach(village-> village.render(g));
        } 
     
     
    }
    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Carte extends JFrame {
     
    	private static final long serialVersionUID = 1L;
    	private JPanel container;
    	// List <Village> villageListe= new ArrayList<Village>();
     
    	public Carte() {
    		// JFrame
    		this.setTitle("carte");
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.setResizable(false);
    		this.setSize(500, 500);
     
    		// container
    		container = new JPanel();
    		container.setBackground(Color.GREEN);
    		container.setLayout(new BorderLayout());
     
    		this.setContentPane(container);
    		this.setVisible(true);
     
    	}
     
    	public Carte(Villages villages) {
    		// JFrame
    		this.setTitle("carte");
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.setResizable(false);
    		this.setSize(500, 500);
     
    		// container
    		container = villages;
    		container.setBackground(Color.GREEN);
    		container.setLayout(new BorderLayout());
     
    		this.setContentPane(container);
    		this.setVisible(true);
    	}
    }
    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
     
    import java.util.List;
     
     
    public class Main {
     
    	public static void main(String[] args) {
     
    		Villages villages = new Villages();
    		Carte carte = new Carte(villages);
     
     
    		Joueur joueur1 = new Joueur("Vincent");
    		Village v1 = new Village("eden", joueur1, 200, 200,villages);
    		Village v2 = new Village("paris", joueur1, 50, 50, villages);
    		v1.setPopulation(50);
     
    		List<Village> liste = joueur1.getVillageList();
     
    		for (Village v : liste) {
    			System.out.println("Je suis le village "+v.getNom()+". J'appartiens au joueur "+v.getProprietaire().getNom());
     
    		}
     
    	}
    }
    Merci encore!!

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

Discussions similaires

  1. [Toutes versions] Mise a jour automatique d'une liste deroulante
    Par zanzibar20 dans le forum Access
    Réponses: 16
    Dernier message: 20/05/2019, 14h46
  2. Réponses: 3
    Dernier message: 03/01/2017, 14h20
  3. Problème de mise a jours d'une JTable
    Par vinzzzz dans le forum Composants
    Réponses: 9
    Dernier message: 01/06/2009, 10h05
  4. [MySQL] Problème de mise a jour d'une donnée dans la base
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 24/05/2007, 16h06
  5. [VBA-E]Mise à jour de cellule alimentée par une liste
    Par moritan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/01/2007, 06h11

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