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 :

Aide grid layout


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Aide grid layout
    Bonjour

    Je me demandais si quelqu'un pourrait m'aider avec un problème d'interface suivant.

    En résumé, je dois créer un tableau de classes Cartes (défini ailleurs), avec un nombre aléatoire de rangées et de colonnes. Pour le test j'ai choisi 4 de chaque. Ceci est un jeu de mémoire, donc je crée un tableau de n cartes dans generateurDeCartesCouleur, et placent chaque carte et une copie aléatoirement dans un tableau de 2 fois cette longeur. Ensuite PanneauDeCartes rajoute un mouselistener, et le panneau est ajouté à mon JFrame.
    Mais ... lorsque que je les affiche avec GridLayout, seulement la moitié des cartes s'affichent.

    Par exemple, avec nRangees = nColonnes = 4, en faisant un forloop sur le tableau, je peux constater que j'ai bel et bien 16 cartes, mais que seulement 8 s'affiche(?)

    Je n'ai pas mis tout le code, le programme est assez long... je ne voulais pas engorger la page. Le tout est dans le fichier ci-joint. J'espère que le tout est clair, je ne suis pas trop à l'aise avec les GUI de java.

    Merci beaucoup pour votre aide,

    Christian

    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
     
    public static void main(String[] args) {
     
    ...
     
    int nRangees = nColonnes = 4;
    int grosseurTableau = nRangees*nColonnes/2;
            Carte [] tabCarte = genererCarte.genereCartes(grosseurTableau);
    PanneauDeCartes panneau;
            panneau = new PanneauDeCartes(nRangees, nColonnes, tabCarte,
                  delaiAffichageInitial, delaiAffichageMauvaisePaire);
     
            boite.add(panneau);
    ...
    }
     
     
     
    public abstract class GenerateurDeCartes { 	...	 }
     
    public class GenerateurDeCartesCouleur extends GenerateurDeCartes {
     
    	/**Propriété private de type tableau de Color qui représente les couleurs disponibles
             */
    	private Color[] couleur;
    	private Carte [] carteTabRetour;
    	private Carte [] carteTab;
    	/**constructeur prenant en paramètre  le nom du thème, 
             * et un tableau de Color contenant tous les couleurs possibles pour ce thème.
             */
    	public GenerateurDeCartesCouleur(String nom, Color [] couleur) {
    		super(nom);
    		this.couleur = new Color[couleur.length];
    		for(int i = 0; i < couleur.length; ++i){
    			this.couleur[i] = couleur[i];
    		}
    	}
     
     
    	/**méthode qui retournera une référence de type Carte 
             * à une carte choisie aléatoirement parmi celles du thème
             */
    	@Override
    	public Carte genereUneCarte() {
    		Random random = new Random();
    		int n = couleur.length;
    		Color c = couleur[random.nextInt(n)];
    		Carte uneCarte = new CarteCouleur(true, c);
    		return uneCarte;
    	}
     
    	/**méthode qui générera un tableau de n cartes selon le thème, 
             * si possible toutes différentes, en faisant des appels répétés à genereUneCarte.
             */
    	@Override
    	public Carte[] genereCartes(int n) {
     
    		//n = moitié du tableau
    		carteTab = new Carte[n];
    		if(n <= couleur.length){
    			for(int i =0; i < n; ++i){
    				carteTab[i] = genereUneCarte();
    				for(int j = 0; j < i; ++j){
    					if (carteTab[i].rectoIdentique(carteTab[j])){
    						--i;
    						break;
    					}
    				}
    			}
    		}
    		else{
    			for(int i =0; i < n; ++i){
    				carteTab[i] = genereUneCarte();
    			}
    		}
    		carteTabRetour = new Carte[2*n];
    		completerPanneau();
    		return carteTabRetour;
     
    	}	// end genereCartes
     
    	protected void completerPanneau() {
    		int count = carteTab.length;
    		carteTabRetour = new Carte[count*2];
    		Carte[] temp = new Carte[count*2];
    		for (int i=0;i<count;i++) temp[i]=carteTab[i];
    		for (int i=count;i<count*2;i++)temp[i]=carteTab[i-count];
    		count = count*2;
    		int change = carteTabRetour.length;
    		do{
    			Random random = new Random();
    			int randomInt = random.nextInt(count);
    			if (temp[randomInt]!=null) {
    				carteTabRetour[randomInt]=temp[randomInt];
    				temp[randomInt]=null;
    				change--;
    			}  
    		}while (change>0);
    	}
     
    }
     
    public class PanneauDeCartes extends JPanel implements MouseListener{
     
    ... attribut défini
     
    	/**constructeur prenant en paramètre le nombre de rangées, le nombre de colonnes, un tableau de Carte et
             * le delai d'affichage initial ou toutes les cartes du panneau sont montrées pendant un temps delaiAffichageInitial avant d'être cachées
             * et le delai d'affichage mauvaise paire quand les deux cartes consécutives ainsi dévoilées (la première et la deuxième) sont différentes, 
             * alors elles demeurent montrées pendant un temps delaiAffichageMauvaisePaire au cours duquel les clicks sur les cartes ne font rien.
     
             */
    	public PanneauDeCartes(int nRangees, int nColonnes, Carte[] cartes, 
            int delaiAffichageInitial, int delaiAffichageMauvaisePaire){
    		GridLayout layout = new GridLayout(nRangees, nColonnes);
    		layout.setHgap(10);
            layout.setVgap(10);
            setLayout(layout);
            /**ajouter MouseListener à chaque carte et ajouter les cartes sur le panneau
                    */	
            for(int i = 0; i < cartes.length; ++i){
            	cartes[i].addMouseListener(this);
        		add(cartes[i]);
            }
     
           retourneinitial(delaiAffichageInitial, cartes); 	  
           delai = delaiAffichageMauvaisePaire;
           nbreCarte = cartes.length/2;
    	}
     
     
     
    ... @Override pour lesmouseAction..
     
    	/**Méthode pour cacher toutes les cartes du panneau qui sont montrées pendant un temps delai Affichage Initial après ce delai
             * @param delaiInitial          le delai d'affichage initial ou toutes les cartes du panneau sont montrées pendant un temps delaiAffichageInitial avant d'être cachées
     
             */
    	public void retourneinitial(int delaiInitial , Carte[] cartes){
     
    		ActionListener al = new ActionListener() {
    		      public void actionPerformed(ActionEvent e) {
    		    	  System.out.println("panneaulength  dans timer " + cartes.length);
    		    	  for(int i = 0; i < cartes.length; ++i){
    		          	cartes[i].cache();  	
    		          }
     
    		    	  timer.stop();
    		      }
    		};
    	    timer = new Timer(delaiInitial,al);
    	    timer.start();
    	    timer.setRepeats(false);
    	  }
    	/**Méthode pour retourner les 2 cartes différentes qui sont montrées pendant un temps delai Affichage mauvaise paire après ce delai
             */
    	public void retourneMauvaisePaire(int delai){
     
    		ActionListener al = new ActionListener() {
    		      public void actionPerformed(ActionEvent e) {
    		    	  carteClicquee.retourne();
    		          premierCarteClicquee.retourne();
    		          premierCarteClicquee = null;
    		          enabled = true;
    		          timer.stop();
    		      }
    		};
    	    timer = new Timer(delai,al);
    	    timer.start();
    	    timer.setRepeats(false);
    	  }//end mauvaise paire
     
    }//end PanneauDeCartes
    Fichiers attachés Fichiers attachés

  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,

    Ton problème vient du fait que tu ne copies pas (au sens "dupliquer") les cartes lorsque tu remplis le tableau de "2 fois la longueur" comme tu dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=0;i<count;i++) temp[i]=carteTab[i];
    for (int i=count;i<count*2;i++)temp[i]=carteTab[i-count];
    Il s'agit de la même instance de CarteCouleur (ou Carte, c'est pareil) : or, Carte est un composant Swing (JComponent). Un composant Swing ne peut être mis que dans un seul container à la fois, et qu'une seule fois dans ce container : le mettre dans un container le retire automatiquement du container où il se trouve (donc il ne peut se trouver 2 fois dans le même container). Il faut que chaque paire de cartes de même couleur soit 2 instances de CarteCouleur différentes. Ou alors, il faut modéliser la carte (Carte/CarteCouleur) sous forme de classe non Swing, et crée 2 instances de composant Swing différentes qui pointent vers la même instance de CarteCouleur.
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Merci
    Merci pour ton aide. C'était vraiment une erreur de débutant!

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

Discussions similaires

  1. [aide] Speedmeter layout
    Par flyingrub dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 09/03/2014, 22h12
  2. Réponses: 3
    Dernier message: 06/01/2010, 14h11
  3. [Ressources biblio] Discussion about the GRIDDED LAYOUT and ABSOLUTE LAYOUT
    Par datametric dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/07/2009, 19h56
  4. Taille bouton dans un grid layout
    Par Magical dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 17/07/2007, 07h29
  5. [SWING] Donner la taille à un Panel avec Grid Layout
    Par Goupo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 08/06/2007, 00h58

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