Changer plusieurs images simultanément dans un tableau

olihya
Changer plusieurs images simultanément dans un tableau

Bonjour,
J'ai fait un tableau de boutons dans lequel je peux changer l'image lorsque je clique sur le bouton. Cela passe d'un pion clair à un pion sombre.
Maintenant, j'aimerai que lorsque je clique sur un pion, cela change certains pions du tableau en même temps. Que cela passe passe d'un pion clair à un pion foncé ou inversement dans des endroits définis du tableau en même temps.
Avez-vous une idée à ce sujet?
Voici mon code:

package test;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel pan = new JPanel();
	protected ImageIcon b1;
	protected ImageIcon b2;
	
	public Fenetre() {

		this.setTitle("Test");
		this.setSize(450, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		setLayout(new GridLayout(5, 5, 0, 0));

		JButton[] b = new JButton[25];
		for (int i = 0; i < b.length; i++) {
			b1 = new ImageIcon("b1.gif");
			b2 = new ImageIcon("b2.gif");
			b[i] = new JButton(b1);
			b[i].addActionListener(this);

			pan.add(b[i]);
		}
		setContentPane(pan);
	}

	{

		this.setContentPane(pan);
		this.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		JButton b = (JButton) (e.getSource());
		ImageIcon mImageIconButton = (ImageIcon) b.getIcon();

		if (mImageIconButton.getDescription().equals(b1.getDescription())) {
			b.setIcon(b2);
		} else if (mImageIconButton.getDescription()
				.equals(b2.getDescription())) {
			b.setIcon(b1);
		}
	}

}

Bonne journée
Niroken

Hello,

Il te suffit de récupérer les sources que j'ai laissé dans ton ancien topic :) , il y a tt ce qu'il faut pour faire ce que tu veux.

Bonne chance,
Niroken

nasix

Salut,

Je pense que tu dois juste créer une fonction qui représente la logique de ton programme (l'algorithme que tu suivras), et puis tu l'appelle dans la méthode actionPerformed de ton listener, je ne pense pas que c'est si compliqué.

Cette méthode doit changer les images de tes boutons selon tes conditions, c'est tout.

Bonne chance.

olihya
Changement simultané dans plusieurs cases d'un tableau

Merci pour votre aide et vos réponses.
Niroken:
Grâce à ton code, j'ai pu l'adapter pour mon tableau et modifier individuellement chaque pion (passer d'un pion clair à un pion foncé).
J'ai relu l'ancien topic mais je me demande comment récupérer les coordonnées des différents pions que je veux changer en même temps en un clic.
Nasix:
Je vois la démarche que tu me suggères mais ce qui me bloque c'est la méthode qui me permet de récupérer les coordonnées des différents pions que je veux changer en même temps en un clic.
Mais je cherche...
Et si vous avez une idée, elle est la bienvenue.
Bonne continuation.

Niroken

Hello,

Ben en fait pour ca j'ai envisagé deux facons de voir les choses, peut être y en a t'il plus.....

La première :
Tu définies un attributà ta classe Frame, tableau matrice de JButton de la facon suivante....

JButton[][] mButtons = new JButton[5][5];

Ta classe JFrame implements ActionListener donc dans la métode action performed tu fais :

public void actionPerformed(ActionEvent e) {
 for (int i = 0; i < mButtons.length; i++) {
  for (int j = 0; j < mButton[i].length j++) {
    if (((JButton)e.getSource()).equals(mButtons[i][j])) {
       //Alors la tu as récupéré la position dans le tableau du boutton cliqué, il te suffit de changer la couleur des pions que tu veux par rapport a celui ci.
    }
  }
 }
}

Pour la seconde, la c'est un peu plus complexe, d'ailleurs j'insiste bien sur le fait que tt est dans l'ancien topic, voir mon dernier post :)

Mais sinon pour l'explication, chaque boutton va avoir des attributs spécifiques qui vont etre sa couleur, et une liste des boutons qui vont changer de couleur en même temp qu'il sera cliqué. Cette liste de bouttons sera chargée au moment où tu initialiseras ta fenetre.
Pour faire ca en java, un petit peu d'héritage :

class ReversoPion extends JButton {
 private List<ReversoPion> mReversoPionsVoisins;
 // enumeration pour indiquer la couleur du pion valeur {fonce, clair}
 private CouleurReversoPioin mCouleurReversoPion;
}

La méthode actionPerformed devient ceci "extrait de l'autre topic" :

public void actionPerformed(ActionEvent pE) { 
                changeReversoPionCouleur(); 
                changeReversoPionsVoisinsCouleur(); 
}

avec les méthodes biens senties :

public void changeReversoPionCouleur() { 
        if (mCouleurReversoPion == CouleurReversoPion.clair) { 
            mCouleurReversoPion = CouleurReversoPion.fonce; 
            setIcon(sImageIconPionFonce); 
        } else if (mCouleurReversoPion == CouleurReversoPion.fonce) { 
            mCouleurReversoPion = CouleurReversoPion.clair; 
            setIcon(sImageIconPionClair); 
        } 
    } 
    
    public void changeReversoPionsVoisinsCouleur() { 
        for (ReversoPion vReversoPionTmp : mReversoPionsVoisins) { 
            vReversoPionTmp.changeReversoPionCouleur(); 
        } 
    } 

C'est quand même moins chargé :) .

Bonne chance,
Niroken

nasix

Niroken,

J'avais pensé à ta première idée, mais la deuxième me parait meilleure.

Bonne chance.

olihya
Changer plusieurs images simultanément dans un tableau

Merci Niroken,
Je cherche dans ce sens et posterai, le code une fois terminé.
Bonne journée

olihya
Changement simultané dans plusieurs cases d'un tableau

Bonjour Niroken,
Je viens de voir le code que tu avais poster sur mon précédent topic.
Je l'avais gardé en favoris mais apparemment cela n'affichait pas les nouveaux messages.
Enfin pardon pour cette confusion.
Je comprend mieux pourquoi tu me renvoyais vers l'ancien topic.
Merci beaucoup.
J'explore tout cela.
Bonne journée. :)

olihya
Changement simultané dans plusieurs cases d'un tableau

Bonjour Niroken,
Meilleur voeux!!!
Ainsi qu'a vous autres développeurs.
J'ai pu tester et admirer le code de Niroken poster dans mon premier topic.
Effectivement ça marche à merveille.
Etant débutant, je suis impressionné par ta capacité à avoir un raisonnement aussi complexe.
J'ai une question à propos de la première méthode que tu proposes dans le second topic.
Tu dis: "Alors la tu as récupéré la position dans le tableau du boutton cliqué, il te suffit de changer la couleur des pions que tu veux par rapport a celui ci."
Mais comment?
J'ai une autre question, j'aimerai lorsque je clique sur l'une des cases ce soit une autre case à un autre endroit du tableau qui change avec ses voisins.
Quelle est la méthode la plus simple pour gérer tout ça?
Bonne continuation :D

Niroken

Hello Olihya,

Bon tout d'abord bonne année à toi aussi et à tout le monde ici :)

J'avoue qu'à force de me complimenter, je vais finir par m'enflammer :) , le code de Niroken, c 'est une merveille hmm hmm :) , Ca me va très bien, lol.

Bon allez, sois sérieux Niro....

Question no 1 :
En fait dans la proposition no1, je t'avais rapidement montré comment récupérer la position dans le tableau des bouttons, celle du boutton cliqué.
Partant de la.. si tu veux changer, la couleur de ses voisins, il faut changer la couleur du boutton [i + 1 , j] [i - 1, j] [i, j - 1] [i, j + 1], ca devrait etre assez simple.

Question no 2 :
Ben en fait, en partant du principe que les bouttons sont stockés dans un tableau a deux dimensions de bouttons, j'avais proposé les solutions pour différencier ceci.....

Dans la proposition 1, puisqu on devait changer la couleur de son pion puis de ses voisins, il fallait evidemment connaitre la position du boutton cliqué dans le tableau pour ensuite changer la coulur de ses voisins, mais ceci impliquait a chaque clic de reparcourir tt le tableau ce qui est "je dirais couteux" mais ici ca va encore dans un tableau de 1à sur 10.
Dans la proposition 2, si on associé la référence des voisins a chaque boutton à l'initialisation, alors quand on clique sur un boutton, on n'a nul besoin de reparcourir tt le tableau, il suffit de changer la couleur des voisins directement puisqu on les connait.

Dans ton cas, je vais te répondre d'abord par deux questions... tu veux changer la couleur d'une case particulière quand tu cliques sur une case.

En premier quelle est la règle précise? par exemple quand je clique sur une case, c est la case a deux cran a droite qui change de couleur etc....
Et la deuxième, est ce que cette règle est permanente sur chaque boutton? c est a dire...un coup je clique hop c est deux cases a droite, pis je reclique hop c est trois cases en haut ?

Voili, voilou

Bonne chance,
Niroken

olihya
Changement simultané dans plusieurs cases d'un tableau

Bonjour Niroken,
merci pour ta réponse.
Je vois que même pendant le réveillon du Jour de l'An tu as les mains sur ton clavier.
Pour ce qui est de merveille, j'utilise le terme que toi même à utilisé (cf:"On lance la merveille ").
De là, je pense que tu es conscient que tu as du talent dans la programmation(ce qui n'est pas mon cas, mais je travail!!!).
Pour ce qui est de la règle, ce serait de faire des inversions de tableau soit en vertical, horizontal ou diagonal.
J'ai une autre question, actuellement le tableau est à 2 dimensions mais est-ce possible de le faire à 1 dimension?
Si oui qu'est-ce que cela engendre?
Bonne journée.

nasix

Hello,

J'interviens juste parce que je dois répondre à votre souhait, bonne année à vous tous, bonne continuation à toi Olihya, et merci Niroken pour tes aides et ta vraie collaboration.

Niroken

Hello,

Pour la grosse tête je blaguais rassures toi :) , bon sinon pour le reste, ca se complique un peu.... mais le mot d'ordre pour cette nouvelle année est..code propre, pas de bazard :)

Donc je te propose une implémentation que tu retrouveras ci dessous, voici comment j'ai vu les choses... je précise avant tte chose que tt ce que j'ai fait peut être sujet à critiques et/ou améliorations.

Le fait que tu veuilles pouvoir choisir le comportement de tes boutons, par "mode", si je puis dire à imposer de découper l'interface en deux parties... une partie qui contient les bouttons reverso, et une autre qui contient le "mode controller" avec un bouton par mode.

J'ai revu un peu mon implémentation pour l'adapter à ton nouveau besoin, parceque ce que j'avais proposé avant ne collait plus tt a fait.

Dans les changements :

Creation de deux nouveaux Panels, un qui contient le tableau de ReversoPions, lautre qui contient les bouttons selecteur de mode.

Les ReversoPions ne contiennent plus la liste de leurs voisins, mais leur position direct dans le tableau, c est le panel qui contient les bouttons qui s'occupera de changer la couleur du boutton cliqué et de ses voisins.

J'ai crée une interface ReversoPionClickedBehaviour avec une seule méthode, c'est l'implémentation de cette interface qui déterminera quel comportement le panel doit adopter quand on clique sur un de ses bouttons.

Code de la fenetre :

package graphic; 

import graphic.container.ReversoPionsBehaviourController;
import graphic.container.ReversoPionsPanel;

import java.awt.Dimension; 
import java.awt.FlowLayout;

import javax.swing.JFrame; 

public class ReversoFrame extends JFrame { 

    private static final long serialVersionUID = 1L; 
    
    private ReversoPionsPanel mReversoPionsPanel;
    private ReversoPionsBehaviourController mReversoPionsBehaviourController;
    
    public ReversoFrame() { 
    	setTitle("Reverso"); 
    	setSize(new Dimension(400, 250));
    	setLayout(new FlowLayout());
    	
    	mReversoPionsPanel = new ReversoPionsPanel();
    	mReversoPionsBehaviourController = new ReversoPionsBehaviourController(mReversoPionsPanel);
    	
    	add(mReversoPionsPanel);
    	add(mReversoPionsBehaviourController);
    	
    	setVisible(true); 
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    } 

} 

Code du panel conteneur de ReversoPion :

package graphic.container;

import graphic.component.ReversoPion;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;

import commun.CouleurReversoPion;
import commun.IReversoPionClickedBehaviour;

public class ReversoPionsPanel extends JPanel {
	
	private static final long serialVersionUID = 1L;
	public static final int sReversoGridHeight = 10; 
    public static final int sReversoGridWidth = 10;
	
    private IReversoPionClickedBehaviour  mReversoPionClickedNormalBehaviour = new IReversoPionClickedBehaviour () {
    	
		public void doReversoPionAction(ReversoPion pReversoPionClicked) {
			int vClickedAbs = pReversoPionClicked.getPositionInArray().x;
			int vClickedOrd = pReversoPionClicked.getPositionInArray().y;
			
			changeReversoPionAndVoisinsCouleur(mReversoPions[vClickedAbs][vClickedOrd]);
		}
		
	};
	
	private IReversoPionClickedBehaviour  mReversoPionClickedVerticalBehaviour = new IReversoPionClickedBehaviour () {
		
		public void doReversoPionAction(ReversoPion pReversoPionClicked) {
			int vClickedAbs = pReversoPionClicked.getPositionInArray().x;
			int vClickedOrd = pReversoPionClicked.getPositionInArray().y;
			
			changeReversoPionAndVoisinsCouleur(mReversoPions[vClickedAbs][sReversoGridWidth - 1 - vClickedOrd]);
		}
		
	};
	
	private IReversoPionClickedBehaviour  mReversoPionClickedHorizontalBehaviour = new IReversoPionClickedBehaviour () {
		
		public void doReversoPionAction(ReversoPion pReversoPionClicked) {
			int vClickedAbs = pReversoPionClicked.getPositionInArray().x;
			int vClickedOrd = pReversoPionClicked.getPositionInArray().y;
			
			changeReversoPionAndVoisinsCouleur(mReversoPions[sReversoGridHeight - 1 - vClickedAbs][vClickedOrd]);
		}
		
	};
	
	private IReversoPionClickedBehaviour  mReversoPionClickedDiagonaleHGBDBehaviour = new IReversoPionClickedBehaviour () {
		
		public void doReversoPionAction(ReversoPion pReversoPionClicked) {
			int vClickedAbs = pReversoPionClicked.getPositionInArray().x;
			int vClickedOrd = pReversoPionClicked.getPositionInArray().y;
			
			changeReversoPionAndVoisinsCouleur(mReversoPions[vClickedOrd][vClickedAbs]);
		}
		
	};
	
	private IReversoPionClickedBehaviour  mReversoPionClickedDiagonaleHDBGBehaviour = new IReversoPionClickedBehaviour () {
		
		public void doReversoPionAction(ReversoPion pReversoPionClicked) {
			int vClickedAbs = pReversoPionClicked.getPositionInArray().x;
			int vClickedOrd = pReversoPionClicked.getPositionInArray().y;
			
			changeReversoPionAndVoisinsCouleur(mReversoPions[sReversoGridWidth - 1 - vClickedOrd][sReversoGridHeight - 1 - vClickedAbs]);
		}
		
	};
    
    private IReversoPionClickedBehaviour mCurrentReversoPionClickedBehaviour;
	private ReversoPion[][] mReversoPions;
	
    public ReversoPionsPanel() {
		setLayout(new GridLayout(sReversoGridHeight ,sReversoGridWidth)); 
        setPreferredSize(new Dimension(200, 200)); 
          
        mReversoPions = new ReversoPion[sReversoGridHeight][sReversoGridWidth]; 
        
        // Creation de chaque bouton 
        for (int i = 0; i < sReversoGridHeight; i++) { 
            for (int j = 0 ; j < sReversoGridWidth; j++) { 
            	mReversoPions[i][j] = new ReversoPion(CouleurReversoPion.clair, new Point(i, j)); 
                mReversoPions[i][j].addActionListener(new ActionListener() {

					public void actionPerformed(ActionEvent e) {
						mCurrentReversoPionClickedBehaviour.doReversoPionAction((ReversoPion) e.getSource());
					}
                	
                });
            	add(mReversoPions[i][j]); 
            } 
        } 
                
        setCurrentReversoPionClickedBehaviour(mReversoPionClickedNormalBehaviour);
	}
	
	private static boolean isReversoPionInArrayBounds(int i , int j) { 
        if (i >= 0 && j >= 0 && i < sReversoGridHeight && j < sReversoGridWidth) { 
            return true; 
        } else { 
            return false; 
        } 
    }
	
	private void changeReversoPionAndVoisinsCouleur(ReversoPion pReversoPion) {
		int vClickedAbs = pReversoPion.getPositionInArray().x;
		int vClickedOrd = pReversoPion.getPositionInArray().y;
		
		mReversoPions[vClickedAbs][vClickedOrd].changeReversoPionCouleur();
		
		if (isReversoPionInArrayBounds(vClickedAbs - 1, vClickedOrd)) { 
        	mReversoPions[vClickedAbs - 1][vClickedOrd].changeReversoPionCouleur();
        } 
        
        if (isReversoPionInArrayBounds(vClickedAbs + 1, vClickedOrd)) { 
        	mReversoPions[vClickedAbs + 1][vClickedOrd].changeReversoPionCouleur();
        } 
        
        if (isReversoPionInArrayBounds(vClickedAbs, vClickedOrd - 1)) { 
        	mReversoPions[vClickedAbs][vClickedOrd - 1].changeReversoPionCouleur();
        } 
        
        if (isReversoPionInArrayBounds(vClickedAbs, vClickedOrd + 1)) { 
        	mReversoPions[vClickedAbs][vClickedOrd + 1].changeReversoPionCouleur();
        }
	}
	
	public IReversoPionClickedBehaviour getReversoPionClickedNormalBehaviour() {
		return mReversoPionClickedNormalBehaviour;
	}

	public IReversoPionClickedBehaviour getReversoPionClickedVerticalBehaviour() {
		return mReversoPionClickedVerticalBehaviour;
	}

	public IReversoPionClickedBehaviour getReversoPionClickedHorizontalBehaviour() {
		return mReversoPionClickedHorizontalBehaviour;
	}

	public IReversoPionClickedBehaviour getReversoPionClickedDiagonaleHGBDBehaviour() {
		return mReversoPionClickedDiagonaleHGBDBehaviour;
	}

	public IReversoPionClickedBehaviour getReversoPionClickedDiagonaleHDBGBehaviour() {
		return mReversoPionClickedDiagonaleHDBGBehaviour;
	}

	public void setCurrentReversoPionClickedBehaviour(IReversoPionClickedBehaviour pCurrentPionClickedBehaviour) {
		mCurrentReversoPionClickedBehaviour = pCurrentPionClickedBehaviour;
	}
			
}

Code de panel selecteur de modes :

package graphic.container;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;

public class ReversoPionsBehaviourController extends JPanel {
	
	private static final long serialVersionUID = 1L;
	
	private JButton mButtonBehaviourNormal;
	private JCheckBox mCheckBoxBehaviourNormal;
	
	private JButton mButtonBehaviourVerticalChange;
	private JCheckBox mCheckBoxBehaviourVerticalChange;
	
	private JButton mButtonBehaviourHorizontalChange;
	private JCheckBox mCheckBoxBehaviourHorizontalChange;
	
	private JButton mButtonBehaviourDiagonaleHGBDChange;
	private JCheckBox mCheckBoxBehaviourDiagonaleHGBDChange;
	
	private JButton mButtonBehaviourDiagonaleHDBGChange;
	private JCheckBox mCheckBoxBehaviourDiagonaleHDBGChange;
	
	private static Dimension sButtonsDimension = new Dimension(120, 20);
	private ReversoPionsPanel mReversoPionsPanel;	
	
	public ReversoPionsBehaviourController(ReversoPionsPanel pReversoPionsPanel) {
		setLayout(new FlowLayout(FlowLayout.LEFT));
		setPreferredSize(new Dimension(160, 200));
		
		mReversoPionsPanel = pReversoPionsPanel;
		
		mButtonBehaviourNormal = new JButton("Normal");
		mButtonBehaviourNormal.setPreferredSize(sButtonsDimension);
		mButtonBehaviourNormal.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				setAllCheckBoxesValue(false);
				mCheckBoxBehaviourNormal.setSelected(true);
				
				if (mReversoPionsPanel != null) {
					mReversoPionsPanel.setCurrentReversoPionClickedBehaviour(mReversoPionsPanel.getReversoPionClickedNormalBehaviour());
				}
			}
				
		});		
		mCheckBoxBehaviourNormal = new JCheckBox();
		mCheckBoxBehaviourNormal.setEnabled(false);
		mCheckBoxBehaviourNormal.setSelected(true);
				
		mButtonBehaviourVerticalChange = new JButton("Vertical");
		mButtonBehaviourVerticalChange.setPreferredSize(sButtonsDimension);
		mButtonBehaviourVerticalChange.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				setAllCheckBoxesValue(false);
				mCheckBoxBehaviourVerticalChange.setSelected(true);
				
				if (mReversoPionsPanel != null) {
					mReversoPionsPanel.setCurrentReversoPionClickedBehaviour(mReversoPionsPanel.getReversoPionClickedVerticalBehaviour());
				}
			}
				
		});
		mCheckBoxBehaviourVerticalChange = new JCheckBox();
		mCheckBoxBehaviourVerticalChange.setEnabled(false);
		
		mButtonBehaviourHorizontalChange = new JButton("Horizontal");
		mButtonBehaviourHorizontalChange.setPreferredSize(sButtonsDimension);
		mButtonBehaviourHorizontalChange.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				setAllCheckBoxesValue(false);
				mCheckBoxBehaviourHorizontalChange.setSelected(true);
				
				if (mReversoPionsPanel != null) {
					mReversoPionsPanel.setCurrentReversoPionClickedBehaviour(mReversoPionsPanel.getReversoPionClickedHorizontalBehaviour());
				}
			}
				
		});	
		mCheckBoxBehaviourHorizontalChange = new JCheckBox();
		mCheckBoxBehaviourHorizontalChange.setEnabled(false);
		
		mButtonBehaviourDiagonaleHGBDChange = new JButton("Diagonale : \\");
		mButtonBehaviourDiagonaleHGBDChange.setPreferredSize(sButtonsDimension);
		mButtonBehaviourDiagonaleHGBDChange.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				setAllCheckBoxesValue(false);
				mCheckBoxBehaviourDiagonaleHGBDChange.setSelected(true);
				
				if (mReversoPionsPanel != null) {
					mReversoPionsPanel.setCurrentReversoPionClickedBehaviour(mReversoPionsPanel.getReversoPionClickedDiagonaleHGBDBehaviour());
				}
			}
				
		});
		mCheckBoxBehaviourDiagonaleHGBDChange = new JCheckBox();
		mCheckBoxBehaviourDiagonaleHGBDChange.setEnabled(false);
		
		mButtonBehaviourDiagonaleHDBGChange = new JButton("Diagonale : /");
		mButtonBehaviourDiagonaleHDBGChange.setPreferredSize(sButtonsDimension);
		mButtonBehaviourDiagonaleHDBGChange.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				setAllCheckBoxesValue(false);
				mCheckBoxBehaviourDiagonaleHDBGChange.setSelected(true);
				
				if (mReversoPionsPanel != null) {
					mReversoPionsPanel.setCurrentReversoPionClickedBehaviour(mReversoPionsPanel.getReversoPionClickedDiagonaleHDBGBehaviour());
				}
			}
				
		});	
		mCheckBoxBehaviourDiagonaleHDBGChange = new JCheckBox();
		mCheckBoxBehaviourDiagonaleHDBGChange.setEnabled(false);
		
		disableDiagonaleButtonsIfNotSquareReversoPionsPanel();
		
		add(mButtonBehaviourNormal);
		add(mCheckBoxBehaviourNormal);
		add(mButtonBehaviourVerticalChange);
		add(mCheckBoxBehaviourVerticalChange);
		add(mButtonBehaviourHorizontalChange);
		add(mCheckBoxBehaviourHorizontalChange);
		add(mButtonBehaviourDiagonaleHGBDChange);
		add(mCheckBoxBehaviourDiagonaleHGBDChange);
		add(mButtonBehaviourDiagonaleHDBGChange);
		add(mCheckBoxBehaviourDiagonaleHDBGChange);
		
	}
	
	private void disableDiagonaleButtonsIfNotSquareReversoPionsPanel() {
		if (ReversoPionsPanel.sReversoGridWidth != ReversoPionsPanel.sReversoGridHeight) {
			mButtonBehaviourDiagonaleHGBDChange.setEnabled(false);
			mButtonBehaviourDiagonaleHDBGChange.setEnabled(false);
		}
	}
	
	private void setAllCheckBoxesValue(boolean pValue) {
		mCheckBoxBehaviourNormal.setSelected(pValue);
		mCheckBoxBehaviourVerticalChange.setSelected(pValue);
		mCheckBoxBehaviourHorizontalChange.setSelected(pValue);
		mCheckBoxBehaviourDiagonaleHGBDChange.setSelected(pValue);
		mCheckBoxBehaviourDiagonaleHDBGChange.setSelected(pValue);
	}
	
}

Code des ReversoPions :

package graphic.component; 

import java.awt.Dimension; 
import java.awt.Point;

import javax.swing.ImageIcon; 
import javax.swing.JButton; 

import commun.CouleurReversoPion; 

public class ReversoPion extends JButton { 

    private static final long serialVersionUID = 1L; 
    
    private static ImageIcon sImageIconPionClair; 
    private static ImageIcon sImageIconPionFonce; 
    
    static { 
        sImageIconPionClair = new ImageIcon("b1.gif"); 
        sImageIconPionFonce = new ImageIcon("b2.gif"); 
    } 
    
    private CouleurReversoPion mCouleurReversoPion;
    private Point mPositionInArray;
    
    public ReversoPion(CouleurReversoPion pCouleurReversoPion, Point pPositionInArray) { 
    	setPreferredSize(new Dimension(20, 20));
    	mCouleurReversoPion = pCouleurReversoPion;
        mPositionInArray = pPositionInArray;
        
        if (mCouleurReversoPion == CouleurReversoPion.clair) { 
            setIcon(sImageIconPionClair); 
        } else if (mCouleurReversoPion == CouleurReversoPion.fonce) { 
            setIcon(sImageIconPionFonce); 
        } 
    } 
    
    public void changeReversoPionCouleur() { 
        if (mCouleurReversoPion == CouleurReversoPion.clair) { 
            mCouleurReversoPion = CouleurReversoPion.fonce; 
            setIcon(sImageIconPionFonce); 
        } else if (mCouleurReversoPion == CouleurReversoPion.fonce) { 
            mCouleurReversoPion = CouleurReversoPion.clair; 
            setIcon(sImageIconPionClair); 
        } 
    } 
    
    public Point getPositionInArray() {
		return mPositionInArray;
	}    

} 

Code de l enum :

package commun;

public enum CouleurReversoPion {
	clair, fonce
}

Signature de l interface de comportement :

package commun;

import graphic.component.ReversoPion;

public interface IReversoPionClickedBehaviour {
	
	public void doReversoPionAction(ReversoPion pReversoPionClicked);
	
}

Methode main:

import graphic.ReversoFrame;


public class Program {

	public static void main(String[] args) {
		new ReversoFrame();
	}

}

Si tu as des questions sur mon code, ou sur l'algo en général n'hésites pas.

Bonne chance,
Niroken

olihya
Changement simultané dans plusieurs cases d'un tableau

Bonjour Niroken,
Merci pour ta réponse.:idea:
Je suis vraiment impressionné par ta capacité à coder.
Maintenant j'etudie ton code;
En tout cas merci pour ton aide que je qualifie d'exceptionnelle et qui me permet de progresser.
Encore une petite question, as-tu un site qui te présente ou qui présente tes activités en informatiques?
Bonne journée. :D

Niroken

Hello Olihya,

J'avoue, je suis bien content que ca t'aie permis d'avancer, c'est l'aide que ca peut apporter qui me motive quand je poste.

Maintenant, je dois dire que je n'ai pas de site perso, c'est à cause de mon point faible, je suis un gros flemmard :) , et puis je n'ai pas encore beaucoup de vécu encore.

Mais ceci dit, l'idée me plait bien. Je te tiendrais au courant quand je passerais à l'action.

Bonne journée,
Niroken

olihya
Changement simultané dans plusieurs cases d'un tableau

Hello Niroken,
Oui, un site perso contribuera à te mettre en valeur et pourra t'aider pour ta carrière.:idea:
Bonne journée. :wink:

olihya
Ajouter des niveaux à mon jeux

Bonjour à vous.
Bonjour Niroken.
Pour continuer le post, j'ai essayé de faire une version à ma façon du reverso.
Moins sophistiquée que la version de Niroken mais j'ai aussi moins de connaissance en java.
Cela dit ta version m'a beaucoup appris.
J'ai reussi à faire le premier niveau et cela fonctionne.
Maintenant, je veux implanter les différents niveaux.
Et là je bloque.

J'y ai mis pour commencer 2 niveaux (le placement des pions du premier niveau est identique au second mais je le changerai après).
Ce qui m'interesse c'est que lorsque je clique sur le JmenuItem niveau2 cela joue le code du niveau2.
Voici mon code:

package reverso;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements ActionListener, Icon {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel pan = new JPanel();
	private JMenuBar barreMenus;
	private JMenu niveaux;
	private JMenuItem niveau1, niveau2, niveau3, niveau4;
	protected ImageIcon b1;
	protected ImageIcon b2;
	protected JButton[] boutons;

	public Fenetre() {

		this.setTitle("Reverso");
		this.setSize(450, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		barreMenus = new JMenuBar();
		setJMenuBar(barreMenus);
		niveaux = new JMenu("Niveaux");
		barreMenus.add(niveaux);
		niveau1 = new JMenuItem("Niveau1");
		niveaux.add(niveau1);
		niveau1.addActionListener(this);
		niveau2 = new JMenuItem("Niveau2");
		niveaux.add(niveau2);
		niveau2.addActionListener(this);
		niveau3 = new JMenuItem("Niveau3");
		niveaux.add(niveau3);
		niveau3.addActionListener(this);
		niveau4 = new JMenuItem("Niveau4");
		niveaux.add(niveau4);
		niveau4.addActionListener(this);

		setLayout(new GridLayout(5, 5, 0, 0));
		JButton[] b = new JButton[25];
		this.boutons = b;
		for (int i = 0; i < b.length; i++) {
			b1 = new ImageIcon("b1.gif");
			b2 = new ImageIcon("b2.gif");
			b[i] = new JButton(b1);
			b[i].setSelectedIcon(b2);
			b[i].addActionListener(this);
			pan.add(b[i]);
		}
		setContentPane(pan);
	}

	{

		this.setContentPane(pan);
		this.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Object source = e.getSource();
		if (e.equals(niveau1)) {
			for (int i = 6; i <= 8; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 11; i <= 13; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}

			for (int i = 16; i <= 18; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 0; i <= 0; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 4; i <= 4; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 20; i <= 20; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 24; i <= 24; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 1; i <= 3; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 5; i <= 5; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 10; i <= 10; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 15; i <= 15; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 21; i <= 23; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 9; i <= 9; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 14; i <= 14; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 19; i <= 19; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
		}
		if (e.equals(niveau2)) {
			for (int i = 6; i <= 8; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 2].setSelected(!boutons[i + 2].isSelected());
					boutons[i - 2].setSelected(!boutons[i - 2].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 11; i <= 13; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}

			for (int i = 16; i <= 18; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 0; i <= 0; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 4; i <= 4; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 20; i <= 20; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 24; i <= 24; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 1; i <= 3; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 5; i <= 5; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 10; i <= 10; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 15; i <= 15; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 21; i <= 23; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i + 1].setSelected(!boutons[i + 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
				}
			}
			for (int i = 9; i <= 9; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 14; i <= 14; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
			for (int i = 19; i <= 19; i++) {
				if (source == boutons[i]) {
					boutons[i].setSelected(!boutons[i].isSelected());
					boutons[i - 1].setSelected(!boutons[i - 1].isSelected());
					boutons[i - 5].setSelected(!boutons[i - 5].isSelected());
					boutons[i + 5].setSelected(!boutons[i + 5].isSelected());
				}
			}
		}
	}

	@Override
	public int getIconHeight() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getIconWidth() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void paintIcon(Component c, Graphics g, int x, int y) {
		// TODO Auto-generated method stub

	}

}

Si quelqu'un à une idée, elle est la bienvenue.
Bonne continuation
Niroken

Bonjour Olihya,

J'ai bien regardé ton message et je me pose une question : les 'niveaux' dont tu parles c'est bien sur pour changer la couleur de différents bouttons suivant la ou on clique.

Par exemple le niveau 1 : tu inverses la couleur du boutton cliqué puis ses voisins.
Le niveau 2 : tu inverses la couleur du symétrique du boutton cliqué par rapport a l axe vertical puis ses voisins.
Le niveau 3 : tu inverses la couleur du symétrique du boutton cliqué par raport a l axe horizontal puis ses voisins.
Le niveau 4 : ....... par rapport à la diagonale partant de en haut à gauche vers en bas a droite
Le niveau 5 : ....... par rapport à la diagonale partant de en haut a droite vers en bas a gauche

Tu me dis si jme trompe? :)

Ensuite j'ai regardé ton code et il y a une chose que je ne comprends pas :
Je n'y ai pas retrouvé les méthodes qui permettent de changer les bouttons de couleur....

Ensuite tu as un soucis de layout puisque a l execution tes bouttons ne sont pas rangé suivant un tableau 5x5.

Pour mémo en java, il faut voir les layout comme des "agenceurs de composants" pour le conteneur courant.

Dans ton cas tu as mis un Gridlayout sur ta frame, ce qui veut dire que tous les composants que tu vas ajouter sur ta frame seront rangé selon le GridLayout.

La composant 'pan' sera donc rangé suivant le GridLayout de la frame.

Mais le hic c est que tu mets les bouttons dans le composant 'pan', tu nas pas associé de layout a pan, donc il prend celui par defaut (un flowLayout), c est pourquoi tes composants ne sont pas rangés en tableau.

une solution est de mettre un gridLayout à pan comme ceci :

pan.setLayout(new GridLayout(5, 5));

Voili, voilou

PS : Comme je n'ai plus internet chez moi, je ne pourrais pas te répondre avant lundi sauf si ca revient avant :)

Bonne chance,
Niroken

olihya
Changer plusieurs images simultanément dans un tableau

Merci pour ta réponse Niroken.
Je vais regarder ça.
Les boutons sont les uns au bout des autres et j'avais dimensionné la fenêtre pour que cela fasse un plateau de 5x5.
Ta solution est plus propre.
Les niveaux correspondent bien à ce que tu dis dans ton message.
J'ai réussi à le faire fonctionner sans avoir mis de niveaux autrement dis juste avec le niveau 1.
Et je bloque sur le faite de pouvoir appeler les niveaux 2, 3 , 4 etc.. et de réutiliser sensiblement le même code que pour le niveau1 mais en changeant les pions qui s'inversent.:?:
Bonne journée.

Niroken

Hello,

Il reste une boulette dans ton code :)
Dans la méthode actionPerformed quand tu fais :

public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      Object source = e.getSource(); 
      if (e.equals(niveau1)) { 
............

Tu compares 'e' de type ActionEvent avec 'niveau1' qui est de type JMenuItem, tu ne passeras donc jamais dans tes boucles.

Le mieux serait de garder en mémoire une info sur le niveau sélectionné quand tu cliques sur tes menus items.

Le code devrait ressembler à ceci :

public void actionPerformed(ActionEvent e) {
    Object source = e.getSource(); 
    if (source instanceof JMenuItem) {
        if (source == niveau1) {
            selectedNiveau = "niveau1";
        } else if (source == niveau2) {
            selectedNiveau = "niveau2";
        } //etc etc
    } else if (source instanceof JButton) {
        if (selectedNiveau.equals("niveau1")) {
            //tes boucles
        } else if (selectedNiveau.equals("niveau2")) {
            //tes boucles
        } //etc etc
    }
}

Bonne chance,
Niroken

olihya
Changer plusieurs images simultanément dans un tableau

Hello Niroken,
Merci pour ta réponse et tes précieux conseils.
Je test ça dans la soirée.
Bon week-end et bon code.
:D

olihya
Changer plusieurs images simultanément dans un tableau

hello,
J'ai une erreur sur le selectedNiveau.:?:
As tu une idée?
Bonne continuation

olihya
Changer plusieurs images simultanément dans un tableau

Trouvé, j'ai fait un create field selectedNiveau.
Et ca marche.
Ca avance... :!: :!: :!: