Changer l'image d'un bouton en cliquant dessus

olihya
Changer l'image d'un bouton en cliquant dessus

Bonjour,
J'ai un tableau de boutons images et j'aimerai lorsque je clique sur un bouton changer l'image (passer d'un pion clair ("b1.gif") à un pion sombre ("b2.gif").
Quelqu'un aurait-il un idée?
Voici mon code:

package test;
 
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
publicclass Fenetre extends JFrame {
 
/**
	 * 
	 */
privatestaticfinallong serialVersionUID = 1L;
private JPanel pan = new JPanel();
 
// private JButton b = new JButton(new ImageIcon("b1.gif"));
 
public Fenetre(){
 
this.setTitle("REVERSO");
this.setSize(450, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setLocationRelativeTo(null);
		setLayout(new GridLayout(5, 5, 5, 5));
 
// Ajout des boutons à notre contentPane
		JButton[] b = new JButton[25];
for(int i = 0; i < b.length; i++){
 
			b[i] = new JButton(new ImageIcon("b1.gif"));
			b[i].addMouseListener(new MouseListener(){
				@Override
publicvoid mouseClicked(MouseEvent e){
// TODO Auto-generated method stub

}
 
				@Override
publicvoid mouseEntered(MouseEvent e){
// TODO Auto-generated method stub

}
 
				@Override
publicvoid mouseExited(MouseEvent e){
// TODO Auto-generated method stub

}
 
				@Override
publicvoid mousePressed(MouseEvent e){
// TODO Auto-generated method stub

}
 
				@Override
publicvoid mouseReleased(MouseEvent e){
// TODO Auto-generated method stub

}
});
			pan.add(b[i]);
}
		setContentPane(pan);
}
 
{
 
this.setContentPane(pan);
this.setVisible(true);
}
}

Bonne journée
Niroken

Hello,

Je te passe un morceau de code qui te permet de changer l icone du boutton en cliquant dessus :

package graphic;

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

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

public class TestJButtonIconFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private JButton mButton;
    
    private ImageIcon mImageIconPionClair;
    private ImageIcon mImageIconPionFonce;
    
    public TestJButtonIconFrame () {
        setLayout(new FlowLayout());
        setSize(new Dimension(100, 100));
        
        mImageIconPionClair = new ImageIcon("b1.gif");
        mImageIconPionFonce = new ImageIcon("b2.gif");
        
        mButton = new JButton(mImageIconPionClair);
        mButton.setPreferredSize(new Dimension(20, 20));
        mButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent pE) {
                ImageIcon mImageIconButton = (ImageIcon) mButton.getIcon();
                
                if (mImageIconButton.getDescription().equals(mImageIconPionClair.getDescription())) {
                    mButton.setIcon(mImageIconPionFonce);
                } else if (mImageIconButton.getDescription().equals(mImageIconPionFonce.getDescription())) {
                    mButton.setIcon(mImageIconPionClair);
                }
            }
            
        });
        
        add(mButton);
                
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    
}

Bonne chance,
Niroken

olihya
Bouton qui change d'image

Merci Niroken,
J'ai testé le code.
Nikel ça marche.
Par contre j'essais de l'intégrer dans mon tableau et là lorsque je clique sur un bouton, il n'y a que le dernier qui change de couleur.
Mystère et boule de gomme!!!
Je continu la recherche.
Bonne journée.

fredericmazue

Quote:
Merci Niroken

C'est un champion :)

Quote:
Par contre j'essais de l'intégrer dans mon tableau et là lorsque je clique sur un bouton, il n'y a que le dernier qui change de couleur

Montre un peu de ton code écrit pour cette intégration, sans cela, on ne peut pas voir ton problème

Niroken
Reverso

Hello,

Je propose une deuxieme version de mon code pour manipuler des tableuax de boutons ainsi que leurs images associées.

Code de la fenetre :

package graphic;

import graphic.component.ReversoPion;

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;

import commun.CouleurReversoPion;

public class ReversoFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private static final int mReversoGridHeight = 10;
    private static final int mReversoGridWidth = 10;
    
    public ReversoFrame() {
        setLayout(new GridLayout(mReversoGridHeight ,mReversoGridWidth));
        setSize(new Dimension(200, 200));
        setTitle("Reverso");
        
        ReversoPion[][] vReversoPions = new ReversoPion[mReversoGridHeight][mReversoGridWidth];
        
        // Creation de chaque bouton
        for (int i = 0; i < mReversoGridHeight; i++) {
            for (int j = 0 ; j < mReversoGridWidth; j++) {
                vReversoPions[i][j] = new ReversoPion(CouleurReversoPion.clair);
                add(vReversoPions[i][j]);
            }
        }
        
        // Pour chaque bouton cree, on ajoute ses voisins
        for (int i = 0; i < mReversoGridHeight; i++) {
            for (int j = 0 ; j < mReversoGridWidth; j++) {
                if (isReversoPionVoisin(i - 1, j)) {
                    vReversoPions[i][j].addReversoPionVoisin(vReversoPions[i - 1][j]);
                }
                
                if (isReversoPionVoisin(i + 1, j)) {
                    vReversoPions[i][j].addReversoPionVoisin(vReversoPions[i + 1][j]);
                }
                
                if (isReversoPionVoisin(i, j - 1)) {
                    vReversoPions[i][j].addReversoPionVoisin(vReversoPions[i][j - 1]);
                }
                
                if (isReversoPionVoisin(i, j + 1)) {
                    vReversoPions[i][j].addReversoPionVoisin(vReversoPions[i][j + 1]);
                }
            }
        }
               
        setVisible(true);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
    
    private static boolean isReversoPionVoisin(int i , int j) {
        if (i >= 0 && j >= 0 && i < mReversoGridHeight && j < mReversoGridWidth) {
            return true;
        } else {
            return false;
        }
    }   

}

Code des boutons qui héritent de la classe JButton

package graphic.component;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

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 List<ReversoPion> mReversoPionsVoisins;
    private CouleurReversoPion mCouleurReversoPion;
    
    public ReversoPion(CouleurReversoPion pCouleurReversoPion) {
        mCouleurReversoPion = pCouleurReversoPion;
        
        if (mCouleurReversoPion == CouleurReversoPion.clair) {
            setIcon(sImageIconPionClair);
        } else if (mCouleurReversoPion == CouleurReversoPion.fonce) {
            setIcon(sImageIconPionFonce);
        }
        
        setPreferredSize(new Dimension(20, 20));
        addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent pE) {
                changeReversoPionCouleur();
                changeReversoPionsVoisinsCouleur();
            }
            
        });
        
        mReversoPionsVoisins = new ArrayList<ReversoPion>();
    }
    
    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();
        }
    }
    
    public void addReversoPionVoisin(ReversoPion pReversoPionVoisin) {
        if (mReversoPionsVoisins != null) {
            mReversoPionsVoisins.add(pReversoPionVoisin);
        }
    }   

}

Une petite enum sans quoi rien ne marche :D

package commun;

public enum CouleurReversoPion {
    clair, fonce
}

On lance la merveille

import graphic.ReversoFrame;


public class Program {

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

}

Pour que ca compile, il est important de placer les classes dans les bons packages, ou alors vous les supprimez.

Bonne chance,
Niroken

olihya
Changement simultané dans plusieurs cases d'un tableau

Merci FrédéricMazue pour ton intervention.
Comme tu dis Niroken est un champion.
Et merci Niroken pour ce code.