Constructeur bouton avec image

Rasryv Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à tous,

Pour m'amuser, je cherche à faire un petit programme java qui fait apparaître dans une fenêtre plusieurs personnes que je connais avec leur nom de famille et leur âge pour faire une sorte de jeu des 7 familles. Le problème est que je n'arrive pas à faire un constructeur qui marche, c'est-à-dire qui me crée un bouton avec la bonne image dessus.

Mon constructeur


Personne(String famille, int age, JButton bouton, ImageIcon portrait){
this.famille=famille;
this.age=age;
this.bouton=bouton;
this.portrait=portrait)
} 


J'ai ajouté plusieurs boutons à ma fenêtre et je voudrais pouvoir faire le lien entre le bouton et l'image, c'est-à-dire que si j'ajoute ma personne

(Dupuis, 20, Personne[1], "Image/JeanDupuis.GIF")


à un bouton, je voudrais que ce bouton affiche le portrait de Jean Dupuis sans que j'aie à faire hors du constructeur

Personne[1].bouton.setIcon(im=new ImageIcon( "Image/JeanDupuis.GIF"). 


Est-il possible de rajouter cette relation directement dans le constructeur? J'ai essayé (en faisant
this.bouton.setIcon(image)
dans le constructeur) mais ça n'a pas marché: il y a une exception NullPointerException qui est lancée et qui me dit Personne.<init>.

Merci!
A voir également:

2 réponses

Rasryv Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai d'ailleurs un autre problème indépendant: comment faire pour remonter à partir de l'un des attributs d'un objet construit à l'objet lui-même? Dans mon exemple, cela reviendrait à pouvoir avoir accès à la personne toute entière ou à l'un de ses attributs en cliquant sur le bouton qui lui est associé. Je ne connais pas de méthode qui puisse m'aider à remonter à la "racine" de l'attribut.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Voici une structure de base dont tu peux t'inspirer :

La classe Main créé la fenêtre et gère les évènements des Carte.
Normalement ton "seul" travail est de modifier les méthodes de la classe Carte qui concernent les évènements souris (qui pour l'instant gèrent juste le déplacement de la carte et l'affichage des évènements sur la console).
Tu devras notamment te servir du lien qu'il y a entre une carte et l'objet Personne, qui a lui même un lien vers la Famille à laquelle il appartient.

PS. N'oublie pas de modifier le chemin d'accès vers les images dans la méthode main, sinon tu ne verras pas grand chose.

import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

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

class Jeu
{
    public static final int IMG_WIDTH=56, IMG_HEIGHT=87;
    
    private final Famille[] tab;
    
    public Jeu(Famille...familles)
    {
        tab = familles;
    }

    public Famille[] familles()
    {
        return tab;
    }
}

class Famille
{
    private final String id;
    private final Personne[] tab;
    
    public Famille(String nom, Personne...personnes)
    {
        id = nom;
        tab = personnes;
        
        for (Personne p : personnes)
            p.setFamille(this);
    }
    
    @Override
    public String toString()
    {
        return id;
    }

    public Personne[] personnes()
    {
        return tab;
    }
}

class Personne
{
    private final String id;
    private final Image img;
    private final Carte carte;
    private Famille fam;
    
    public Personne(String prenom, String fileImage)
    {
        id = prenom;
        img = new ImageIcon(fileImage).getImage();
        fam = null;
        carte = new Carte(this);
    }
    
    public Image image()
    {
        return img;
    }
    
    /*friendly*/ void setFamille(Famille famille)
    {
        if (fam!=null)
            throw new RuntimeException(id+" ne peut pas être ajouté à la famille "+famille+" car il appartient déjà à la famille "+fam);
        else
        {
            fam=famille;
            carte.setName("Carte("+toString()+")");
        }
    }
    
    public String toString()
    {
        return fam+id;
    }

    public Component carte()
    {
        return carte;
    }
}

class Carte extends Component implements MouseListener, MouseMotionListener
{
    private static final long serialVersionUID = 1L;
    
    private final Personne pers;
    
    private final Point pos = new Point(0,0);
    
    public Carte(Personne p)
    {
        pers = p;
        setSize(Jeu.IMG_WIDTH, Jeu.IMG_HEIGHT);
        addMouseListener(this);
        addMouseMotionListener(this);
    }
    
    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        g.drawImage(pers.image(), 0, 0, Jeu.IMG_WIDTH, Jeu.IMG_HEIGHT, null);
    }
    
    @Override
    public void mouseClicked(MouseEvent e)
    {
        System.out.println(e);
    }
    
    @Override
    public void mousePressed(MouseEvent e)
    {
        pos.setLocation(e.getPoint());
        System.out.println(e);
        
        // dessiner la carte sélectionnée par dessus le reste
        Container cont = getParent();
        int z = cont.getComponentZOrder(this);
        for (Component comp : cont.getComponents())
        {
            int zi = cont.getComponentZOrder(comp);
            if (zi<z)
                cont.setComponentZOrder(comp, zi+1);            
        }
        cont.setComponentZOrder(this, 0);
        repaint();
    }
    
    @Override
    public void mouseReleased(MouseEvent e)
    {
        System.out.println(e);
    }
    
    @Override
    public void mouseEntered(MouseEvent e)
    {
        System.out.println(e);
    }
    
    @Override
    public void mouseExited(MouseEvent e)
    {
        System.out.println(e);
    }
    
    @Override
    public void mouseDragged(MouseEvent e)
    {
        setLocation(getLocation().x+e.getX()-pos.x,getLocation().y+e.getY()-pos.y);
        System.out.println(e);
    }
    
    @Override
    public void mouseMoved(MouseEvent e)
    {
        System.out.println(e);
    }    
}

public class Main
{
    public static void main(String[] args)
    {
        Jeu jeu = new Jeu
        (
            new Famille("Dupuis",
                new Personne("Jean", "C:/DupuisJean.jpg"),
                new Personne("Marie", "C:/DupuisMarie.jpg")
            ),
            
            new Famille("Dupond",
                new Personne("Bertrand", "C:/DupondBertrand.jpg"),
                new Personne("Jacques", "C:/DupondJacques.jpg")
            )
        );
        
        JFrame frame = new JFrame();
        frame.setLayout(null);
        
        for (Famille f : jeu.familles())
        for (Personne p : f.personnes())
            frame.add(p.carte());
        
        frame.setLocationByPlatform(true);//setLocationRelativeTo(null);
        frame.setSize(500,500);
        //frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
La confiance n'exclut pas le contrôle
0