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 :

paintComponent n'affiche rien


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
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Par défaut paintComponent n'affiche rien
    Bonjour,
    je commence en java et j'essaie de créer un jeu de mémoire
    pour le début, j'essaye avec un tableau de cartes de couleurs. Mon problème c'est je n'arrive pas à afficher les cartes crées, j'ai l'impression que la méthode paintComponent ne se fait pas appelée
    voici mon code
    classe CarteCouleur
    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class CarteCouleur extends Carte {
     
    	private Color couleur;
    	public CarteCouleur(Color c){
    		super(true);
    		couleur = c;
    		repaint();
    	}
    	public void paintRecto(Graphics2D g){
    		g.setColor(couleur);
    		g.fillRect(0,0,this.getWidth(),this.getHeight());
     
    	}
    	public void paintComponent(Graphics2D g){
    		//super.paintComponent(g);
    		System.out.println("c bon");
    		if(estMontree()){
    			paintRecto(g);
     
    		}
    		else{
    			paintVerso(g);
    		}
     
    	}
    }
    la classe panneauDeCartes
    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
    import java.io.*;
    import java.net.URL;
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    public class PanneauDeCartes extends JPanel implements MouseListener {
     
    	private int nRangees, nColonnes, delai0, delai1;
     
    	private ImageIcon image, dos;
     
    	public PanneauDeCartes(int nRangees, int nColonnes, CarteCouleur[] cartes, int delai0, int delai1){
     
    		GridLayout layout = new GridLayout(nRangees,nColonnes);
    		layout.setHgap(10);
    		layout.setVgap(10);
    		setLayout(layout);
    		//image = createImage("http://data.photos-animaux.com/photos/629/6287/800-1-628686.jpg");
    		//dos = createImage("http://data.photos-animaux.com/photos/629/6288/1280-3-628724.jpg");
    		for(int i =0;i<nRangees*nColonnes; i++){
    			this.add(cartes[i]);
     
    		}
     
    	}
     
    	public static ImageIcon createImage(String img_urlstring){
            URL img_url = null;
            try { img_url = new URL(img_urlstring); }
            catch(IOException e)
            { 
                try {img_url = new URL("https://"+"webtoolfeed.files.wordpress.com/2012/01/create-your-url1.jpg");}
                catch(IOException e2) {}
            }
            ImageIcon img_icon = new ImageIcon(img_url);
            return img_icon;
        }
    	public void mouseClicked(MouseEvent e) {
     
    	   }
     
    	public void mouseEntered(MouseEvent e) {
     
    	}
     
    	public void mouseExited(MouseEvent e) {
     
    	}
     
    	public void mousePressed(MouseEvent e) {
     
    	}
     
    	public void mouseReleased(MouseEvent e) {
     
    	}
    }
    et finalement la classe JeuMemory
    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
    import javax.swing.*;
    import java.awt.*;
    public class JeuMemory {
     
    	public static void main(String[] args) {
    		JFrame f = new JFrame("jeu de mémoire");
    		CarteCouleur[] c = new CarteCouleur[8];
    		c[0] = new CarteCouleur(Color.BLUE);
    		c[1] = new CarteCouleur(Color.RED);
    		c[2] = new CarteCouleur(Color.GREEN);
    		c[3] = new CarteCouleur(Color.ORANGE);
    		c[4] = new CarteCouleur(Color.YELLOW);
    		c[5] = new CarteCouleur(Color.CYAN);
    		c[6] = new CarteCouleur(Color.MAGENTA);
    		c[7] = new CarteCouleur(Color.PINK);
     
    		PanneauDeCartes p = new PanneauDeCartes(2,4,c,200,200);
    		f.add(p);
    		f.setSize(600,600);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setVisible(true);
    		f.setLocationRelativeTo(null);
    	}
     
    }
    merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, ça devrait être (voir comment la sélection de méthode se fait par rapport au type en Java) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void paintComponent(Graphics g){
    		//super.paintComponent(g);
    		System.out.println("c bon");
    		if(estMontree()){
    			paintRecto((Graphics2D)g);
     
    		}
    		else{
    			paintVerso((Graphics2D)g);
    		}
     
    	}
    Et Carte doit étendre un composant Swing (JPanel par exemple), ou étendre une classe qui étend...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Déjà, ça devrait être (voir comment la sélection de méthode se fait par rapport au type en Java) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void paintComponent(Graphics g){
    		//super.paintComponent(g);
    		System.out.println("c bon");
    		if(estMontree()){
    			paintRecto((Graphics2D)g);
     
    		}
    		else{
    			paintVerso((Graphics2D)g);
    		}
     
    	}
    Et Carte doit étendre un composant Swing (JPanel par exemple), ou étendre une classe qui étend...
    merci beaucoup, ca marche nikel
    la classe Carte dérive directement de JComponent
    sinon est ce que je dois rajouter super.paintComponent ou ce n'est pas nécessaire?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par momo-mtl Voir le message
    merci beaucoup, ca marche nikel
    la classe Carte dérive directement de JComponent
    sinon est ce que je dois rajouter super.paintComponent ou ce n'est pas nécessaire?
    Le super.paintComponent() va appeler la méthode standard de dessin du JComponent : tu n'en as pas forcément besoin à priori, surtout si le dessin ta carte recouvre entièrement le composant. Donc, non, ce n'est pas nécessaire dans ton cas. On le fait quand on dessine pas sur l'ensemble du composant, donc que le fond derrière le composant est censé apparaître (ou pas, selon que le composant soit opaque ou pas), pour laisser la méthode standard se charger du fond du composant de manière standard.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Par défaut
    merci pour tous ces éclaircissements,
    Cependant, j'ai une dernière question
    je ne sais pas comment procéder pour garder la carte affichée un certain temps puis la cacher automatiquement
    je crois qu'il faut utiliser un timer mais je n'ai aucune idée comment ça marche

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Imagine que tu devais faire ça avec 2 boutons :
    1. un bouton qui rend visible la carte
    2. un bouton qui rend invisble la carte


    Tu aurais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    JButton button1 = new JButton("Rendre visible");
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                  rendreVisibleLaCarte();
        }
    });
    JButton button2 = new JButton("Rendre invisible");
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                  rendreInvisibleLaCarte();
        }
    });
    Et bien avec un Timer (un javax.swing.Timer, pas un java.util.Timer), c'est a peu de choses près pareil :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    JButton button1 = new JButton("Rendre visible");
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                  rendreVisibleLaCarte();
                  new Timer(1000, new ActionListener() {
     
    			@Override
    			public void actionPerformed(ActionEvent e1) {
    				rendreInvisibleLaCarte();
    			}
    		}).start();
     
        }
    });
    le 1000, c'est le délai en millisecondes avant l'action se déclenche par le timer.

    Maintenant, la problématique de rendre visible/invisible c'est une autre histoire, et dépend pas mal de la façon dont tu gères ton plateau de jeu. On peut ajouter et enlever le composant (donc add(), ce que tu fais déjà, et remove() pour l'enlever, ce qui nécessite de faire un revalidate() et un repaint() juste après pour rafraîchir l'affichage). On peut utiliser setVisible( visible ) avec visible true ou false : le JPanel Carte reste présent, mais ne s'affiche plus (il prend toujours de la place ou pas selon le LayoutManager). Mais peut-être veux-tu simplement afficher le dos de la carte ?


    PS en Java 8, on peut écrire plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JButton button1 = new JButton("Rendre visible");
    button1.addActionListener(e->{
         rendreVisibleLaCarte();
         new Timer(1000, e1-> rendreInvisibleLaCarte()).start();       
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Boot mais n'affiche rien
    Par log2n dans le forum Assembleur
    Réponses: 28
    Dernier message: 03/11/2005, 21h16
  2. Mon programme n'affiche rien!!!!
    Par matthieu5978 dans le forum Langage
    Réponses: 1
    Dernier message: 03/11/2005, 11h28
  3. pourquoi mon quickreport n'affiche rien ?
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 8
    Dernier message: 31/07/2005, 00h59
  4. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38
  5. Opengl n'affiche rien.
    Par Fugus02 dans le forum OpenGL
    Réponses: 4
    Dernier message: 06/01/2004, 15h41

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