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

  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!

  7. #7
    Invité
    Invité(e)
    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
    attendez j'arrive...

  8. #8
    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
    Bah, j'assume, je suis nul en java parce que je suis trop compliqué. Les meilleurs codeurs sont toujours ceux qui arrivent à créer en quelques dizaines de lignes un programme très puissant.
    Pour ma part, je me noie dans une dizaine de classes pour arriver à un résultat médiocre qui marche deux fois sur trois ...

  9. #9
    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
    Excuse-moi de mon silence, je te donne enfin une réponse. Une première question: au lieu d'écrire jbStart==null est-il possible d'utiliser equals()? J'ai vu que c'était utilisé de façon assez courante.

    Ensuite, ton code m'ouvre les yeux sur quelque chose que je n'avais pas comprise et que j'aimerais bien confirmer: je croyais qu'on mettait absolument tout ce qui se passait dans le ActionPerformed mais en réalité, on n'y met quasiment rien, non? J'ai l'impression que tu es passé par une méthode que tu as ensuite appelée dans le ActionPerformed. Moi, j'étais persuadé qu'il fallait mettre dans le ActionPerformed tous les if et tous les cas de si on cliquait sur un bouton puis sur l'autre ou si on inversait ou si on se trompait alors que d'après ce que tu as fait, il faut créer une méthode qui le fait puis l'appeler dans le ActionPerformed.

    Je ne comprends pas non plus ce que tu as mis pour gérer les exceptions (d'ailleurs, les exceptions ne sont pas très claires dans ma tête, je crois qu'elles servent juste à prévenir dans le cas d'une erreur et elle permettent de montrer où est l'erreur): pourquoi as-tu mis une distribution de cartes dans HeadlessException? Je pense que c'est pour pouvoir donner de façon récursive un String qui puisse être attaché à chacun des boutons comme tu l'avais fait précédemment avec setActionCommand().

    Voilà, et sinon, ton code ne marche pas sur mon ordi: il dit qu'il n'y a pas de main dans l'éditor?
    Bref, si j'ai dit une bêtise, n'hésite pas à me corriger. Merci beaucoup pour ton aide!

  10. #10
    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
    Citation Envoyé par Xenthys Voir le message
    au lieu d'écrire jbStart==null est-il possible d'utiliser equals()?
    Non, ça n'est pas possible du tout pour la comparaison avec null :
    pour preuve, si tu fais jbStart.equals(null), tu as une NullPointerException dans le cas où jbStart est null


    Citation Envoyé par Xenthys Voir le message
    ton code m'ouvre les yeux sur quelque chose que je n'avais pas comprise et que j'aimerais bien confirmer: je croyais qu'on mettait absolument tout ce qui se passait dans le ActionPerformed mais en réalité, on n'y met quasiment rien, non? J'ai l'impression que tu es passé par une méthode que tu as ensuite appelée dans le ActionPerformed. Moi, j'étais persuadé qu'il fallait mettre dans le ActionPerformed tous les if et tous les cas de si on cliquait sur un bouton puis sur l'autre ou si on inversait ou si on se trompait alors que d'après ce que tu as fait, il faut créer une méthode qui le fait puis l'appeler dans le ActionPerformed.
    Généralement, tu essayes de respecter les principes suivant :
    • Une classe n'implémente que ses propres fonctionnalités (et ne fait pas aussi celles d'une autre)
    • Une méthode n'implémente qu'une seule fonctionnalité, et bien

    Le respect de ces 2 principes te permet d'implémenter ton code petit à petit en travaillant sur des problèmes atomiques (1 seul sujet) à chaque fois. Il facilite ensuite le débogage (c'est plus facile de savoir qui est responsable de quoi : quel objet, quelle méthode)

    C'est en respectant ces principes que j'ai opté pour une classe InnerSwap permettant d'alléger le code du ActionPerformed

    Citation Envoyé par Xenthys Voir le message
    Je ne comprends pas non plus ce que tu as mis pour gérer les exceptions (d'ailleurs, les exceptions ne sont pas très claires dans ma tête, je crois qu'elles servent juste à prévenir dans le cas d'une erreur et elle permettent de montrer où est l'erreur): pourquoi as-tu mis une distribution de cartes dans HeadlessException? Je pense que c'est pour pouvoir donner de façon récursive un String qui puisse être attaché à chacun des boutons comme tu l'avais fait précédemment avec setActionCommand().
    Non, il n'y a pas de distribution de cartes dans HeadlessException !
    Le throws HeadlessException doit être enlevé et ne sert plus à rien...Cela signifiait que le code pouvait lever une Exception de type HeadlessException, et qu'il renvoyait la gestion de cette Exception aux méthodes appelantes

    Citation Envoyé par Xenthys Voir le message
    Voilà, et sinon, ton code ne marche pas sur mon ordi: il dit qu'il n'y a pas de main dans l'éditor?
    Bref, si j'ai dit une bêtise, n'hésite pas à me corriger. Merci beaucoup pour ton aide!
    Va sur la classe dans le package Explorer, et fait Run As/ Java Application

  11. #11
    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
    Merci pour ta réponse très complète. Je voulais également savoir une précision sur quelque chose qui est assez flou à mes yeux. Que signifie inerSwanp= new InnerSwap()? Ce que je veux dire, c'est: que signifie la construction de quelque chose de nouveau si ce quelque chose n'est pas un objet mais toute une classe? Si dans la classe principale, je fais innerSwap=new InnerSwap(), ça signifie que je vais pouvoir utiliser toutes les méthodes d'InnerSwap sur innerSwap? Et si oui, que représente innerSwap?

    Et une précision supplémentaire, tu as tout mis dans une classe parce que tu voulais tout me montrer et si je voulais le transposer à mon programme, je ne garde que la classe InnerSwap en enlevant la classe TestSwapButtons ou il faut vraiment le rédiger comme ça même si ma classe principale est ailleurs?

    Remarque: ton programme marche nikel, c'est moi qui en le copiant, je l'ai copié dans une classe au niveau de la racine au lieu de le copier dans le src ...

  12. #12
    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,
    Citation Envoyé par Xenthys Voir le message
    Je voulais également savoir une précision sur quelque chose qui est assez flou à mes yeux. Que signifie inerSwanp= new InnerSwap()? Ce que je veux dire, c'est: que signifie la construction de quelque chose de nouveau si ce quelque chose n'est pas un objet mais toute une classe? Si dans la classe principale, je fais innerSwap=new InnerSwap(), ça signifie que je vais pouvoir utiliser toutes les méthodes d'InnerSwap sur innerSwap? Et si oui, que représente innerSwap?
    InnerSwap est une classe (Modèle), innerSwap une instance (objet) de cette classe.
    C'est exactement comme pour l'instanciation de n'importe quel objet, par exemple l'instanciation d'un JButton, à la différence près que la classe JButton est définie ailleurs...
    JButton bt = new JButton(text);
    Ce qui te perturbe peut-être, c'est que la classe InnerClass soit définie dans une autre. C'est ce qu'on appelle une innerClasse, et ça n'a d'influence que sur la visibilité.

    Citation Envoyé par Xenthys Voir le message
    Et une précision supplémentaire, tu as tout mis dans une classe parce que tu voulais tout me montrer et si je voulais le transposer à mon programme, je ne garde que la classe InnerSwap en enlevant la classe TestSwapButtons ou il faut vraiment le rédiger comme ça même si ma classe principale est ailleurs?
    Tu peux utiliser la classe InnerSwap et la délocaliser où tu veux, peu importe, et le TestSwapButtons n'était là que pour l'exemple

  13. #13
    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'ai posté une autre discussion mais j'en profite pour remonter celle-ci:

    J'ai essayé ton code que voici:

    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
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    //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;
     
    		String MAIN1;
     
    		String MAIN2;
     
    		String TAPISDEJEU;
     
    		JLabel infos;
     
    		private InnerSwap innerSwap = new InnerSwap();
     
    		//Création des deux joueurs
     
    		Joueur Joueur1;
     
    		Joueur Joueur2;
     
    		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;
    						System.out.println("Coucou");
    					}
    				} else {
    					// Si on clique sur un bouton du Tapis
    					// Echange des images des 2 boutons
    					if (jb.getActionCommand().startsWith("TAPIS")) {
    						Icon Img = jb.getIcon();
    						jbStart.setIcon(Img);
    						jbStart = null;
     
    					}
    				}
    			}
    		}
     
     
    		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.setActionCommand("Pioche");
    		topPanel.add(Fin);
    		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(getButton(MAIN1+i, i, CartesGauche[i]));
    		}
    		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(getButton(MAIN2+i, i, CartesDroite[i]));
    		}
    		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(getButton(TAPISDEJEU+i+j, i,j,CartesMilieu[i][j]));
    			}
     
    		}
     
     
    		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++){
    			Carte a;
    			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++){
    			Carte b;
    			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]);
     
    				}
    			//Placement des bornes
     
    			for(int i=0;i<9;i++){
    				CartesMilieu[i][3].setIcon(new ImageIcon("Images/Borne.gif"));
    				}
    		}	
     
    		private JButton getButton(String type, int index, JButton bt) {
    			bt.setActionCommand(type + index);
    			bt.addActionListener(this);
    			return bt;
    		}
     
    		private JButton getButton(String type, int index1, int index2, JButton bt) {
    			bt.setActionCommand(type + index1 + index2);
    			bt.addActionListener(this);
    			return bt;
    		}
     
     
    		public static void main(String[] args) {
    			SchottenTotten laPartie=new SchottenTotten();
    			laPartie.distribueDebut();
     
    		}
     
     
    		public void actionPerformed(ActionEvent e) {
    			innerSwap.add((JButton) e.getSource());
    		}
     
     
     
     
     
    	}
    J'ai essayé de l'adapter à ma situation en changeant le texte en image et en faisant les ajustements nécessaires (modification et surcharge de la méthode getButton) mais ça ne marche pas! J'ai place le System.out.println("coucou") pour tester le fait que le bouton soit cliqué et ça ne marche pas non plus et je ne vois pas où est le problème ...

    Bref, encore une fois, je t'appelle à l'aide . Désolé ...

  14. #14
    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
    Bonsoir,
    si c'est juste le swap qui ne fonctionne pas, ce sera mieux comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	String MAIN1="MAIN1";
    	String MAIN2="MAIN2";
    	String TAPISDEJEU="TAPISDEJEU";

  15. #15
    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
    Ça marche vraiment bien! Merci beaucoup.

+ 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, 01h29
  2. [SWING] KeyListener qui ne marche pas
    Par kindool dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2005, 19h04
  3. Iptables configuration qui ne marche pas....
    Par The_Nail dans le forum Sécurité
    Réponses: 7
    Dernier message: 03/02/2004, 14h27
  4. Réponses: 3
    Dernier message: 08/09/2003, 15h06
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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