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

Composants Java Discussion :

Mise à jour du GridLayout


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut Mise à jour du GridLayout
    Je suis en train de faire un petit jeu d'échec, mais j'ai un problème avec le GridLayout et le mouvement des pions.
    Nom : MIqdA1k.jpg
Affichages : 225
Taille : 68,8 Ko
    Chaque case est un Pion dont la classe Pion est le parent. Chacun des Pion a sa propre méthode PaintComponent.
    Par exemple la Classe Tour :
    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
    public class Tour extends Pion {
     
    	private static final long serialVersionUID = 1L;
     
            //Appel le constructeur de la classe Pion
    	public Tour(String nom, boolean vie) {
    		super(nom, vie, true);
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.setColor(Color.BLUE);
    		g.fillOval(0, 0, 100, 100);
    		g.setColor(Color.WHITE);
    		g.drawString(nom, 30, 50);
    		if (selected == true) {
    			Graphics2D g2d = (Graphics2D) g;
    			g2d.setColor(Color.GREEN);
    			g2d.setStroke(new BasicStroke(10));
    			g2d.drawRect(0, 0, 100, 100);
    		}
    	}
    }
    Et les espaces vides sont des objets "Case" qui sont tout simplement vide, mais qui on un identifiant.
    Mon problème, c'est que lorsque je cliques sur un Pion et une case par la suite, je n'arrive pas à les inter-changer, ils ne font que disparaitre.

    Nom : jf2B9DX.png
Affichages : 199
Taille : 13,5 Ko

    Classe Board qui gère l'interface :
    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
    public class Board extends JPanel {
     
    	private static final long serialVersionUID = 1L;
     
    	public static boolean Selected = false;
     
    	public static Pion PionClicked = null;
    	public static Case CaseClicked = null;
     
    	private Pion[][] game = new Pion[8][8];
     
    	GridLayout gl = new GridLayout(8, 8);
     
    	public Board() {
    		createGame();
    		refreshLayout();
    	}
     
    	//Créer le tableau en 2D pour avoir l'emplacement de chaque Pion au début de la game. 
    	private void createGame() {
    		Deck deckEnemy = new Deck();
    		Deck deck = new Deck();
    		for (int c = 0; c < 16; c++) {
    			deckEnemy.array.get(c).nom += "e";
    			if (c < 8) {
    				game[0][c] = deckEnemy.array.get(c);
    			} else {
    				game[1][c - 8] = deckEnemy.array.get(c);
    			}
    		}
    		int i = 0;
    		for (int r = 2; r < 6; r++) {
    			for (int c = 0; c < 8; c++) {
    				game[r][c] = new Case("case" + i, true);
    				i++;
    			}
    		}
     
    		for (int c = 15; c > -1; c--) {
    			if (c > 7) {
    				game[6][c - 8] = deck.array.get(c);
    			} else {
    				game[7][c] = deck.array.get(c);
    			}
    		}
    	}
     
    	//Rafraichir le Layout pour mettre les Pion à la bonne position
    	private void refreshLayout() {
    		setLayout(new GridLayout(8, 8));
    		for (int r = 0; r < 8; r++) {
    			for (int c = 0; c < 8; c++) {
    				add("Case", game[r][c]);
    			}
    		}
    		revalidate();
    	}
     
    	//Lorsqu'un Pion est cliqué et une Case vide par la suite, ils changent de place
    	public void deplacement() {
    		int posP1 = 0, posP2 = 0, posC1 = 0, posC2 = 0;
    		for (int r = 0; r < 8; r++) {
    			for (int c = 0; c < 8; c++) {
    				if (game[r][c].nom.equals(PionClicked.nom)) {
    					posP1 = r;
    					posP2 = c;
    				} else if (game[r][c].nom.equals(CaseClicked.nom)) {
    					posC1 = r;
    					posC2 = c;
    				}
    			}
    		}
    		game[posP1][posP2] = CaseClicked;
    		game[posC1][posC2] = PionClicked;
    		PionClicked.deselectionner();
    		CaseClicked = null;
    		setLayout(null);
    		game[posP1][posP2].revalidate();
    		game[posP1][posP2].repaint();
    		game[posC1][posC2].revalidate();
    		game[posC1][posC2].repaint();
    		refreshLayout();
    	}
     
    	//Créer le background
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		for (int r = 0; r < 8; r++) {
    			for (int c = 0; c < 4; c++) {
    				if (r % 2 == 0) {
    					g.fillRect(c * 200, r * 100, 100, 100);
    				} else {
    					g.fillRect(c * 200 + 100, r * 100, 100, 100);
    				}
    			}
    		}
    	}
    }


    Merci d'avance pour vos réponses!

  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,

    La méthode la plus évidente est de réutiliser ta méthode refreshLayout(). Ce qu'il faut, c'est avant de l'appeler, retirer tous les composants par removeAll(), puis appeler refreshLayout(), puis forcer le rafraichissement de l'UI par l'appel de revalide(), puis repaint().

    Par exemple, tu crées une méthode dans la classe Board :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void update() {
       removeAll();
       refreshLayout();
       revalidate();
       repaint();
    }
    que tu appelles après chaque déplacement (ou plus généralement, chaque fois que tu changes quelque chose dans le tableau game).

    Au passage, tu peux remplacer ton c]add("Case", game[r]); par add(game[r][c]). Déjà la méthode a été remplacée par une méthode plus générale : add( Component component, Object constraint ), mais en plus la contrainte "Case" n'est pas gérée par le GridLayout, autant ne rien mettre.

    L'autre solution serait de ne modifier que les composants concernés. C'est un peu plus complexe, et c'est plus rapide, mais vu que tu n'as pas beaucoup de pions, ça n'est pas indispensable. L'idée repose sur le fait que les composants ajoutés dans un conteneur sont stockés dans un tableau qu'on peut obtenir par la méthode getComponents(). Ce tableau est à plat : il faut donc une fonction qui passe de coordonnées x,y à une coordonnée linéaire. La fonction est très simple :
    • pour passer de x,y à i : i = y * nbColonne + i
    • accessoirement, les fonctions inverses, pour passer de i à x,y : y = i/nbColonnes et x=i%nbColonnes


    Donc pour échanger des pièces entre x1,y1 et x2,y2, on détermine le i1 correspondant à x1,y1, le i2 correspondant à x2,y2. On échange les 2 composants situés en i1 et i2 dans le tableau (obtenu par getComponents()), et on appelle revalidate() puis repaint().

    [EDIT] : je viens de voir que tu viens de rajouter setLayout(new GridLayout(8, 8)); en début de refreshLayout(). C'est inutile : fais-le une fois pour toute dans le constructeur de Board. Le revalidate() est inutile pour l'appel avant affichage de la JFrame (c'est fait d'office lors du premier affichage).
    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
    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
    Accessoirement, pour centrer le texte dans le pion, au lieu de mettre une position en dur, regarde ici.
    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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2013
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Merci Beaucoup!

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

Discussions similaires

  1. Comment empêcher la mise à jour d'un contrôle à l'écran ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2003, 12h52
  2. [mise à jour]Comment procéder sans tout péter...
    Par FFF dans le forum Installation
    Réponses: 3
    Dernier message: 10/09/2003, 08h11
  3. Mise à jour de la version de MySQL
    Par jobstar dans le forum Administration
    Réponses: 8
    Dernier message: 18/08/2003, 10h45
  4. mise à jour de champs time (interbase)
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 04/03/2003, 10h25
  5. Réponses: 2
    Dernier message: 12/02/2003, 15h26

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