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

AWT/Swing Java Discussion :

ActionListener qui ne marche pas


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Par défaut ActionListener qui ne marche pas
    Bonjour à tous,

    J'ai un petit souci en ce moment avec ma gestion d'événements sur java. J'essaie de coder un jeu dont l'interface graphique n'est composée que de boutons. Il y a six boutons pour la main de chaque joueur et 7*9=63 boutons au milieu. Je souhaitais implémenter ActionListener et faire en sorte que lorsque un joueur clique sur un bouton de son jeu puis sur un bouton du tapis de jeu (l'un des 7*9 boutons), les images qui sont sur chacun des boutons s'échange. Voici le code complet de la classe principale, le ActionPerformed est à la toute fin:

    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
    //IMPLEMENTATION DES INTERFACES
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
     
    import javax.swing.*;
     
    public class SchottenTotten extends JFrame implements ActionListener {
     
    		JButton[] CartesGauche;
     
    		JButton[] CartesDroite;
     
    		JButton[][] CartesMilieu;
     
    		ArrayList<Carte> cartes;
     
    		ArrayList<Carte> copie;
     
    		ImageIcon[] Im1;
     
    		ImageIcon[] Im2;
     
    		ImageIcon[][] Images;
     
    		Carte a;
     
    		Carte b;
     
    		JLabel infos;
    		//Création des deux joueurs
     
    		Joueur Joueur1;
     
    		Joueur Joueur2;
     
    		//Cartes intermédaires lors de la distribution
     
     
    		public SchottenTotten(){
     
    		JButton Bpioche = new JButton ("pioche");
    		JButton Fin= new JButton("Fin");
    		JFrame fen = new JFrame ("Schotten Totten ");
    		fen.setLocation(200,100);
    		fen.setPreferredSize (new Dimension (900 ,600));
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fen.setLayout(new BorderLayout ());
     
    		// Boutons situés en haut de la fenêtre, pioche et le nom des joueurs //
    		JPanel topPanel = new JPanel (new GridLayout(1,4));
    		topPanel.add(new JLabel ("Joueur 1"));
    		topPanel.add(Bpioche);
    		Bpioche.addActionListener(this);
    		topPanel.add(Fin);
    		Bpioche.addActionListener(this);
    		topPanel.add(new JLabel ("Joueur 2"));
    		fen.add(topPanel,BorderLayout.NORTH );
     
    		// Cartes du joueur 1
    		CartesGauche = new JButton[6];
    		JPanel leftPanel = new JPanel (new GridLayout(6,1));
    		for(int i=0;i<6;i++){
    			CartesGauche[i]= new JButton();
    			leftPanel.add(CartesGauche[i]);
    			CartesGauche[i].addActionListener(this);
    		}
    		fen.add(leftPanel, BorderLayout.WEST);
     
     
    		// Cartes du joueur 2
    		CartesDroite = new JButton[6];
    		JPanel rightPanel = new JPanel (new GridLayout(6,1));
    		for(int i=0;i<6;i++){
    			CartesDroite[i]= new JButton();
    			rightPanel.add(CartesDroite[i]);
    			CartesDroite[i].addActionListener(this);
    		}
    		fen.add(rightPanel, BorderLayout.EAST);
     
    		//Tapis de Jeu
    		JPanel centerPanel = new JPanel (new GridLayout (9 ,7));
    		CartesMilieu= new JButton[9][7];
    		for(int i=0; i<9;i++){
    			for(int j=0;j<7; j++){
    				CartesMilieu[i][j]=new JButton();
    				centerPanel.add(CartesMilieu[i][j]);
    				CartesMilieu[i][j].addActionListener(this);
    			}
    		}
     
     
    		fen.add(centerPanel,BorderLayout.CENTER);
     
    		//Statistiques de jeu
     
    		JPanel bottomPanel = new JPanel (new GridLayout(1,1));
    		JLabel infos=new JLabel("infos du jeu");
    		bottomPanel.add(infos);
    		fen.add(bottomPanel,BorderLayout.SOUTH);
     
    		fen.pack ();
    		fen.setVisible(true);
    	}
     
    		//Méthode de distribution des cartes
     
    		void distribueDebut(){
    			Paquet p = new Paquet();
    			Collections.shuffle(p.cartes);
     
    			//Tableau d'images pour pouvoir gérer les échanges d'images quand les joueurs jouent
     
    			Im1=new ImageIcon[6];
    			Im2=new ImageIcon[6];
    			Images=new ImageIcon[9][7];
     
    			for(int i=0; i<6;i++){
    			a=p.cartes.get(i);
    			p.cartes.remove(i);
    			Im1[i]=new ImageIcon("Images/"+a.clan.name()+a.val+".GIF");
    			CartesGauche[i].setIcon(Im1[i]);
    			}
     
     
    			for(int i=0;i<6;i++){
    			b=p.cartes.get(i);
    			p.cartes.remove(i);
     
    			Im2[i]=new ImageIcon(("Images/"+b.clan.name()+b.val+".GIF"));
    			CartesDroite[i].setIcon(Im2[i]);
     
    				}
     
    			for(int i=0;i<9;i++){
    				CartesMilieu[i][3].setIcon(new ImageIcon("Images/Borne.gif"));
    				}
    		}	
     
     
     
     
    		public static void main(String[] args) {
    			SchottenTotten laPartie=new SchottenTotten();
    			laPartie.distribueDebut();
    		}
     
     
    		public void actionPerformed(ActionEvent evt) {
     
    			for(int i=0;i<6;i++){
    			if (evt.getActionCommand().equals(CartesGauche[i])) {
    				for(int j=0;j<10;j++){
    					for(int k=0;k<7;k++){
    					if(evt.getActionCommand().equals(CartesMilieu[j][k])){
    					CartesMilieu[j][k].setIcon(Im1[i]);
    					CartesGauche[i].setIcon(new ImageIcon());
    					}
     
     
    					}
    				}
    				}
    			}
    		}
     
    	}
    Quand je fais ça, rien ne se passe quand je clique, ai-je fais quelque chose de faux?

    Merci d'avance!

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    Ce n'est pas le ActionListener qu'il faut remettre en cause,
    c'est le code un peu sale que tu as mis dans la méthode actionPerformed

    D'ailleurs, si tu mets un point d'arrêt sur la première ligne du actionPerformed, que tu redémarres ton prog en mode debug, et que tu cliques sur un de tes boutons, tu verras que l'exécution passe bien au bon endroit...

    Je te conseille de reprendre entièrement l'implémentation du actionPerformed, et d'en faire une version sans itérations

    Si l'objectif du actionPerformed est de faire un swap entre l'image du 1er bouton cliqué (main du joueur) et du second (Tapis de jeu), je pense qu'il faudrait :

    • Dissocier les boutons (main du joueur) des boutons (Tapis de jeu)
    • Mémoriser le premier bouton cliqué (de type Main)
    • Déclencher un swap des images si un second bouton est cliqué de type (Tapis de jeu)


    La dissociation peut se faire par l'attribution d'un actionCommand spécifique pour chacun des types de boutons, muni d'un préfixe par ex :
    MAIN pour un bouton de la main du joueur,
    TAPIS pour une bouton du Tapis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    jbUneCarteDeLaMain.setActionCommand("MAIN1");
    jbUneCarteDuTAPIS.setActionCommand("TAPIS3");
    La mémorisation du premier bouton cliqué de type MAIN peut se faire en variable d'instance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private JButton btMainSelected;
    Le actionPerformed déclenche le swap si btMainSelected n'est pas NULL, et si le bouton cliqué (evt.getSource()) est de type TAPIS.

    Ce swap se limite à inverser les icônes de btMainSelected et evt.getSource()

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Par défaut
    Le jbMainSelected est à déclarer avec les autres attributs au début? J'ai un peu de mal à voir où il intervient dans le ActionPerformed. Et je dois bien faire une boucle if dans le ActionPerformed non?

    J'ai commencé en écrivant ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void actionPerformed(ActionEvent evt) {
    		if(evt.getSource()==Main1){
    			if(evt.getSource()==TapisDeJeu){
    mais le problème est que je ne sais pas comment faire pour avoir l'image associée au bouton CartesGauche[i] ou CartesDroite[i] ou CartesMilieu[i][j] qui se cache derrière evt puisque evt se produit lorsqu'une carte (gauche ou droite) est cliquée puis lorsqu'une des cartes du tapis de jeu est cliquée.

    Je n'arrive pas à trouver de méthode pour échanger les images et même si j'y parvenais, je ne comprends pas comment dire quelles images échanger étant donné qu'il n'y a pas le numéro du bouton sur lequel s'est produit evt. L'idéal est que j'ai pu faire evt.getSource().getImage() mais ça ne marche pas, d'abord parce que la méthode n'est pas la bonne et après parce que evt tel que je l'ai écrit fait référence au clic sur le jeu d'un joueur mais aussi sur le tapis de jeu. Bref, je suis un peu perdu ... . Je ne suis pas très bon, vous l'aurez compris.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Par défaut
    J'avais aussi trouvé par rapport à un autre post que j'avais écrit qu'on pouvait ajuster la taille d'un bouton à celle de l'image mais ça ne fait strictement rien. Sauriez-vous pourquoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CartesDroite[i].setIcon(Im2[i]);
    	CartesDroite[i].setSize(Im2[i].getIconWidth(),Im2[i].getIconHeight());

  5. #5
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    J'illustre ce que j'ai expliqué précédemment par un exemple de Swap entre 1 bouton de la main d'un joueur (à gauche de la fenêtre) et un bouton du tapis (en haut) :

    L'exemple se fait avec échange du texte, et pas avec les images (mais c'est la même chose)

    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
     
    public class TestSwapButtons extends JFrame implements ActionListener {
    	private InnerSwap innerSwap = new InnerSwap();
     
    	//Classe interne permettant d'échanger le texte d'un bouton de la main avec 1 bt du tapis
    	private class InnerSwap {
    		private JButton jbStart;
     
    		public void add(JButton jb) {
    			if (jbStart == null) {
    				// Si on clique sur un Bouton de notre main
    				if (jb.getActionCommand().startsWith("MAIN")) {
    					jbStart = jb;
    				}
    			} else {
    				// Si on clique sur un bouton du Tapis
    				// Echange des textes des 2 boutons
    				if (jb.getActionCommand().startsWith("TAPIS")) {
    					String tmpText = jb.getText();
    					jb.setText(jbStart.getText());
    					jbStart.setText(tmpText);
    					jbStart = null;
    				}
    			}
    		}
    	};
     
    	public static void main(String[] args) {
    		TestSwapButtons t = new TestSwapButtons();
     
    	}
     
    	/**
             * Création d'un bouton quelconque
             * @param type
             * @param index
             * @param text
             * @return
             */
    	private JButton getButton(String type, int index, String text) {
    		JButton bt = new JButton(text);
    		bt.setActionCommand(type + index);
    		bt.addActionListener(this);
    		return bt;
    	}
     
    	public TestSwapButtons() throws HeadlessException {
    		super();
    		JFrame fen = new JFrame("Test Swap");
    		fen.setLocation(200, 100);
    		fen.setPreferredSize(new Dimension(900, 600));
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fen.setLayout(new BorderLayout());
    		JPanel mainPanel = new JPanel(new GridLayout(4, 1));
    		JPanel tapisPanel = new JPanel(new GridLayout(1, 4));
    		tapisPanel.setSize(300, 200);
    		fen.add(tapisPanel, BorderLayout.NORTH);
    		fen.add(mainPanel, BorderLayout.WEST);
     
    		// Ajout de Cartes dans la main et sur le Tapis
    		for (int i = 0; i < 6; i++)
    			mainPanel.add(getButton("MAIN" + i, i, "Carte " + i));
    		for (int i = 0; i < 4; i++)
    			tapisPanel.add(getButton("TAPIS" + i, i, "Tapis " + i));
    		fen.pack();
    		fen.setVisible(true);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		innerSwap.add((JButton) e.getSource());
    	}
    }
    Si les commentaires ne suffisent pas, n'hésite pas à poser des questions

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Par défaut
    Je vais regarder tout ça demain parce que je n'ai pas eu le temps aujourd'hui. En tout cas, merci beaucoup pour ton aide et ta patience!

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

Discussions similaires

  1. Méthode getSize() qui ne marche pas
    Par mush_H dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 20/03/2005, 02h29
  2. [SWING] KeyListener qui ne marche pas
    Par kindool dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2005, 20h04
  3. Iptables configuration qui ne marche pas....
    Par The_Nail dans le forum Sécurité
    Réponses: 7
    Dernier message: 03/02/2004, 15h27
  4. Réponses: 3
    Dernier message: 08/09/2003, 16h06
  5. Réponses: 9
    Dernier message: 07/05/2003, 13h57

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