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

Agents de placement/Fenêtres Java Discussion :

[JPanel] ajouter une image


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut [JPanel] ajouter une image
    Salut,
    Je suis en train de faire une interface pour jouer au jeu de Go.
    J'ai créé un JPanel avec en fond l'image de l'aire de jeu (un carré de 19x19).
    J'essaye de créer une classe Pierre.
    Chaque pierre jouée sera une instance de cette classe.
    Mes questions :
    Comment créer cette classe ?
    Comment afficher la pierre sur le JPanel qui contient déjà une image de fond ?
    Merci d'avance.
    Michel

  2. #2
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut Re: [Swing] ajouter une image sur un JPanel
    Citation Envoyé par Michel38
    Salut,
    Je suis en train de faire une interface pour jouer au jeu de Go.
    J'ai créé un JPanel avec en fond l'image de l'aire de jeu (un carré de 19x19).
    J'essaye de créer une classe Pierre.
    Chaque pierre jouée sera une instance de cette classe.
    Mes questions :
    Comment créer cette classe ?
    Je comprends pas trop ta question. Tu crées une classe pierre avec les attributs de base : couleur, position,... et les methodes permettant des les utilisés : placer, enlever, ...

    Citation Envoyé par Michel38
    Comment afficher la pierre sur le JPanel qui contient déjà une image de fond ?
    Le plus simple est, à mon avis, de créer un panel pour chaque pierre et de le placer correctement et les enlever en cas de besoin.

    tu peux également placer tout les panels a l'avance et jouer sur leur visibilité.

  3. #3
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut Re: [Swing] ajouter une image sur un JPanel
    Citation Envoyé par @ldehan
    Je comprends pas trop ta question. Tu crées une classe pierre avec les attributs de base : couleur, position,... et les methodes permettant des les utilisés : placer, enlever, ...
    En fait, comme une pierre est quelque chose de graphique, j'imagine qu'il faut dire que ma classe Pierre hérite d'une autre classe...
    La seule classe qui comporte une méthode paint.. à part JPanel, je n'en vois pas d'autre !!

    Citation Envoyé par @ldehan
    Le plus simple est, à mon avis, de créer un panel pour chaque pierre et de le placer correctement et les enlever en cas de besoin.
    tu peux également placer tout les panels a l'avance et jouer sur leur visibilité.
    Ah d'accord, ça répond à un peu à ma question, ma classe Pierre devrait donc hériter de la classe JPanel ???
    Merci[/quote]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Déjà il y a beacoup de classe qui ont la méthode paint (cf. l'index de la javadoc).

    Ensuite a ta place je prendrai plutot un JLabel pour ta pierre et je mettrai le Layout de ton JPanel (le plateau de jeu si g bien compris) à null pour pouvoir placer tes pierre dessus comme tu le veux a partir des coordonnées.

    Apres pour le rendu de tes pierres tu n'as plus qu'a surcharger la méthode paint.
    Mess with the best, die like the rest!

  5. #5
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Oui, c'est bien ça, mon JPanel est bien le plateau de jeu.
    Et en effet la méthode paint est une méthode héritée de la classe JComponent !! donc existe également pour un JLabel.
    J'essaie tout de suite.
    Merci bien ..

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    ton Pion doit etendre Component, je te conseille JComponent, mais JLabel marche aussi, surtout pour l'insertion d'image

    sinon tu redefinis la methode paint de Pion et du fait un fillRect par exemple ou ensuite un drawImage.

    Par la suite, tu peux faire implementer MouseListener par Pion, afin de par exemple déplacer tes pions a la souris

  7. #7
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut Re: [Swing] ajouter une image sur un JPanel
    Citation Envoyé par @ldehan
    tu peux également placer tout les panels a l'avance et jouer sur leur visibilité.
    C'est une idée qui m'a paru très intéressante, hélas, les pierres peuvent être blanches ou noires.
    Ca aurait pu être bon si toutes les pierres avaient la même couleur...
    Je continue ma quète

  8. #8
    Membre actif Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Points : 278
    Points
    278
    Par défaut
    pour l'héritage à toi de voir donc... a mon avis toutes choses enoncées sont faisable simplement.

    Citation Envoyé par Michel38
    Citation Envoyé par @ldehan
    tu peux également placer tout les panels a l'avance et jouer sur leur visibilité.
    C'est une idée qui m'a paru très intéressante, hélas, les pierres peuvent être blanches ou noires.
    Ca aurait pu être bon si toutes les pierres avaient la même couleur...
    Je continue ma quète
    en fait ca ne change rien, comme tu joue sur la visibilité, rien ne t'empeche de placer les 2 pierres a chaque place et d'afficher la bonne selon le joueur.

    ca presente l'avantage d'être tres rapide afficher/cacher mais ca fait créer beaucoup d'objet inutile (surtout au debut de la partie)

    j'avais bien conscience que tu avais 2 couleurs j'avais utiliser ca pour un othello ou reversi.

    La meilleure solution reste a mon avis le label avec un mouse listener pour placer le pion a la souris comme l'a dit pierre.cellard
    Citation Envoyé par pierre.cellard
    ton Pion doit etendre Component, je te conseille JComponent, mais JLabel marche aussi, surtout pour l'insertion d'image

    sinon tu redefinis la methode paint de Pion et du fait un fillRect par exemple ou ensuite un drawImage.

    Par la suite, tu peux faire implementer MouseListener par Pion, afin de par exemple déplacer tes pions a la souris

  9. #9
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par @ldehan
    en fait ca ne change rien, comme tu joue sur la visibilité, rien ne t'empeche de placer les 2 pierres a chaque place et d'afficher la bonne selon le joueur.

    ca presente l'avantage d'être tres rapide afficher/cacher mais ca fait créer beaucoup d'objet inutile (surtout au debut de la partie)
    D'accord, mais comme je fais apparaître ma pierre avec la méthode paint (qui ne marche pas d'ailleurs), comment puis je faire pour faire apparaître et disparaître ma pierre ?
    code de ma classe Pierre :
    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
    import java.awt.*;
    import javax.swing.*;
     
    public class Pierre extends JLabel
    {
        private Dimension coord;
        private Color coulPierre;
        private Toolkit tk = Toolkit.getDefaultToolkit();
        private final Image pierreN = tk.getImage("images/pierren.gif");
        private final Image pierreB = tk.getImage("images/pierreb.gif");
        private PanGoban panGob;
        private Color blanc = Color.white;
        private Color noir = Color.black;
     
        public Pierre (Color inCol, Dimension inDim,JPanel inGob)
        {
            if ((inCol != blanc) && (inCol != noir))
            {
                coulPierre = blanc;
            }
            else
            {
                coulPierre = inCol;
            }
            coord = inDim;
            panGob = (PanGoban) inGob;
     
        }
     
        public Color getCoulPierre() {
            return coulPierre;
        }
     
        public void setCoulPierre(Color coulPierre) {
            this.coulPierre = coulPierre;
        }
     
        public Dimension getCoord() {
            return coord;
        }
     
        public void setCoord(Dimension coord) {
            this.coord = coord;
        }
     
        public void placerPierre(Dimension dim)
        {
            this.setVisible(true);
        }
     
        public void enleverPierre(Dimension dim)
        {
            this.setVisible(false);
        }
     
        public void paint (Graphics g)
        {
            if (coulPierre == blanc )
            {
                g.drawImage(pierreB,coord.height,coord.width,25,25,panGob);
            }
            else
            {
                g.drawImage(pierreN,coord.height,coord.width,25,25,panGob);
            }
        }
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Je pense que ta méthode paint ne marche pas à cause de ton attribut coord (d'ailleurs je ne vois pas à quoi il sert).

    Essai de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(pierreB,coord.height,coord.width,25,25,panGob);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(pierreB,0,0,25,25,panGob);
    Et tu dis faire disparaitre et reapparaitre ta piere avec la méthode paint, je ne vois pas ou (à moin que ce soit la méthode paint de ta table de jeu).

    Et perso je n aurai pas fait comme ca. Je trouve l'idée de placer tous les pions à l'avance un peu bizard. Il suffit de cadriller ton plateau de jeux et de placer une pierre sur le carreau ou tu as cliqué, c pas plus compliqué que ca.

    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
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
     
    public class JeuxDeGo extends JFrame{
     
    	public static final int PL_WIDTH = 1000;
    	public static final int PL_HEIGHT = 1000;
     
    	public static final int P_WIDTH = 100;
    	public static final int P_HEIGHT = 100;
     
    	public static final int PLAYER1 = 0;
    	public static final int PLAYER2 = 1;
     
    	JPanel plateau = new JPanel() {
    		public void paintComponent(Graphics g) {
    			super.paintComponent(g);
    			g.setColor(Color.BLACK);
    			for (int i=1; i<PL_WIDTH/P_WIDTH; i++){
    				g.drawLine(0,i*P_HEIGHT,PL_WIDTH,i*P_HEIGHT);
    				g.drawLine(i*P_WIDTH,0,i*P_WIDTH,PL_HEIGHT);
    			}
    		}
    	};
    	int player = PLAYER1;
     
    	public JeuxDeGo() {
    		super("JeuxDeGo");
     
    		plateau.setLayout(null);
    		plateau.setSize(PL_WIDTH,PL_HEIGHT);
    		plateau.addMouseListener(new MouseAdapter(){
    			public void mouseClicked(MouseEvent e) {
    				int x = e.getX();
    				int y = e.getY();
    				x = x - (x%P_WIDTH);
    				y = y - (y%P_HEIGHT);
    				Pierre p = new Pierre();
    				p.setLocation(x,y);
    				if (JeuxDeGo.this.player == PLAYER1)
    					p.setColor(Color.WHITE);
    				else 
    					p.setColor(Color.BLACK);
    				JeuxDeGo.this.player = (JeuxDeGo.this.player+1)%2;
    				JeuxDeGo.this.plateau.add(p);
    				JeuxDeGo.this.plateau.repaint();
    			}
    		});
    		this.getContentPane().add(plateau);
    	}
     
    	public static void main (String arg[]) {
    		JeuxDeGo t = new JeuxDeGo();
    		t.setSize(PL_WIDTH,PL_HEIGHT);
    		t.setVisible(true);
    	}
     
    }
     
    class Pierre extends JLabel {
    	Color c;
     
    	public Pierre() {
    		super();
    		setSize(JeuxDeGo.P_WIDTH,JeuxDeGo.P_HEIGHT);
    	}
     
    	public void setColor(Color _c) {
    		c = _c;
    	}
     
    	public void paint(Graphics g) {
    		g.setColor(c);
    		g.fillOval(0,0,JeuxDeGo.P_WIDTH,JeuxDeGo.P_HEIGHT);
    	}
     
    }
    Mess with the best, die like the rest!

  11. #11
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par barbu0055
    Je pense que ta méthode paint ne marche pas à cause de ton attribut coord (d'ailleurs je ne vois pas à quoi il sert).
    En fait ce sont les coordonnées où la pierre devra être affichée..

    Et tu dis faire disparaitre et reapparaitre ta piere avec la méthode paint, je ne vois pas ou (à moin que ce soit la méthode paint de ta table de jeu).
    Non, en fait c'est une méthode que je n'ai pas encore finalisé... Je ne vois pas comment faire en fait.
    la méthode paint de la table de jeu affiche justement la table de jeu.
    et la méthode paint de ma classe Pierre devrait afficher la pierre...

    Et perso je n aurai pas fait comme ca. Je trouve l'idée de placer tous les pions à l'avance un peu bizard. Il suffit de cadriller ton plateau de jeux et de placer une pierre sur le carreau ou tu as cliqué, c pas plus compliqué que ca.
    Qu'appelles tu un carreau ? Un JLabel ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Si coord sont les coordonnées d'affichage ok, mais ne les utilise pas dans ta méthode paint. Parce que je suppose que coord sont des coordeonnées relative au plateau de jeux, alors que dans paint il fo donner des coordonnées relatives au composant possédant la méthode. Donc ton image sera toujours affiché au point (0,0) de ta pierre c'est pourquoi je t'ai dit de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(pierreN,0,0,25,25);
    En ce qui concerne mon carreau, il est fictif, il est donné par un quadrillage de mon plateau de jeu. Et tu peux calculer le carreau sur lequel tu clique à partir de la position de la souris, de la taille du plateau, de la taille d'un carreau. (Tout est dans mon exemple qui ne gere que le placement des pions. Tu peux l'executer). Une fois que tu la position du carreau , tu n'as plus qu'a placer une pierre à cet endroit.
    Mess with the best, die like the rest!

  13. #13
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Je crois que j'ai réussi à afficher ma pierre sur mon JPanel....
    Génial...
    Sauf que ma pierre apparaît sous mon fond de JPanel !!!
    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
    public class PanGoban extends JPanel
    {
        private final Image goban = getToolkit().getImage("images/goban2.gif");
        private final Image fond = getToolkit().getImage("images/fond.gif");
        private Pierre pierre;
     
        public PanGoban ()
        {
            this.setLayout (null);
            pierre = new Pierre(Color.black, PanGoban.this);
            pierre.setBounds(new Rectangle(25,25,25,25));
            add(pierre);
            setVisible(true);
        }
     
        public void paint(Graphics g)
        {
            super.paint(g);
            setBackground(Color.lightGray);
            g.drawImage(fond,0,0,700,800,this);
            g.drawImage(goban,0,0,480,550,this);
        }
    Donc si je mets mes 2 lignes drawImage en commentaire, je vois ma pierre, sinon, je vois peandant 1/10 de seconde ma pierre et ensuite mes images de fond viennent se positionner dessus !!!
    J'ai essayé de voir si je pouvais résoudre le problème avec des JLayeredPane... est ce la solution ?
    Merci de vos réponses..

  14. #14
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par Michel38
    public void paint(Graphics g)
    {
    super.paint(g);
    setBackground(Color.lightGray);
    g.drawImage(fond,0,0,700,800,this);
    g.drawImage(goban,0,0,480,550,this);
    }
    C'est normal, tu peins les images une fois que ton JPanel (et tous ses composants fils) ont été peints.
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public PanGoban () 
        { 
            ...
            setBackground(Color.lightGray);
            ...
            setVisible(true); 
        } 
     
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(fond,0,0,700,800,this);
            g.drawImage(goban,0,0,480,550,this);
    }

  15. #15
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Oh punaise, c'est trop top.... je vois enfin ma pierre sur mon goban (c'est le nom de l'aire de jeu)
    Merci infiniment

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

Discussions similaires

  1. comment ajouter une image dans mon HTML??
    Par Mickey.jet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/03/2006, 15h12
  2. [SQL Server] Ajouter une image
    Par lepiou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/01/2006, 09h10
  3. [JPanel]Mettre une image dans un JPanel
    Par ehmppowa dans le forum Composants
    Réponses: 11
    Dernier message: 30/11/2005, 20h17
  4. [JPanel] capturer une image
    Par cyber_jad dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 07/10/2004, 11h05
  5. [C#] ajouter une image dynamiquement
    Par h_imane dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/04/2004, 11h27

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