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
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
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.
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.
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....
Ta classe JFrame implements ActionListener donc dans la métode action performed tu fais :
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 :
La méthode actionPerformed devient ceci "extrait de l'autre topic" :
avec les méthodes biens senties :
C'est quand même moins chargé :) .
Bonne chance,
Niroken
Niroken,
J'avais pensé à ta première idée, mais la deuxième me parait meilleure.
Bonne chance.
Merci Niroken,
Je cherche dans ce sens et posterai, le code une fois terminé.
Bonne journée
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. :)
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
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
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.
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.
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 :
Code du panel conteneur de ReversoPion :
Code de panel selecteur de modes :
Code des ReversoPions :
Code de l enum :
Signature de l interface de comportement :
Methode main:
Si tu as des questions sur mon code, ou sur l'algo en général n'hésites pas.
Bonne chance,
Niroken
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
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
Hello Niroken,
Oui, un site perso contribuera à te mettre en valeur et pourra t'aider pour ta carrière.:idea:
Bonne journée. :wink:
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:
Si quelqu'un à une idée, elle est la bienvenue.
Bonne continuation
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 :
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
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.
Hello,
Il reste une boulette dans ton code :)
Dans la méthode actionPerformed quand tu fais :
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 :
Bonne chance,
Niroken
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
hello,
J'ai une erreur sur le selectedNiveau.:?:
As tu une idée?
Bonne continuation
Trouvé, j'ai fait un create field selectedNiveau.
Et ca marche.
Ca avance... :!: :!: :!: