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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    Comme ma classe est dérivée directement de JComponent, je ne peux pas utiliser ActionListener mais plutôt MouseListner et j'imagine que c'est le même principe je vais essayer tout ça
    merci beaucoup pour prendre le temps de me répondre aussi vite
    Effectivement je veux juste afficher le dos de la carte et pour cela j'ai deux fonctions montre() et cache()

  8. #8
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si la carte s'affiche en cliquant dessus, effectivement, il te faudra utiliser un MouseListener (de préférence la classe MouseAdapter). En revanche, pour le Timer, ça reste un ActionListener bien sûr.
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    désolé encore, j'ai spécifié que ma classe PanneauDeCartes implements MouseListner, mais je ne vois pas comment utiliser la classe MouseAdapter pour éviter d'implementer les 5 fonctions
    et quand je mets t = new Timer(1000, new MouseListener()) eclipse me donne erreur:
    the constructor Timer(int,new MouseListener()) is undefined

  10. #10
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par momo-mtl Voir le message
    désolé encore, j'ai spécifié que ma classe PanneauDeCartes implements MouseListner, mais je ne vois pas comment utiliser la classe MouseAdapter pour éviter d'implementer les 5 fonctions
    et quand je mets t = new Timer(1000, new MouseListener()) eclipse me donne erreur:
    the constructor Timer(int,new MouseListener()) is undefined
    C'est une pratique assez couramment indiqué que d'implémenter l'interface sur la classe, mais c'est une mauvaise pratique, parce que les méthodes de l'interface sont publiques, donc les méthodes du MouseListener en occurrence sont exposées. Ce n'est pas gravissime, mais non seulement il est inutile de le faire, et ça limite les possibilités (de muilti-écouteurs), ça oblige à avoir des méthodes dont on ne fait rien, voire des attributs qui se baladent dans la classe, et ça permet d’accéder à des fonctionnalités par l'extérieur de la classe qu'on ne devrait pas normalement.

    Au lieu d'implémenter un écouteur sur le composant graphique, en faisant implements MouseListener, et faire addMouseListener(this), on fait simplement (dans le constructeur par exemple du composant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    addMouseListener(new MouseAdapter() {
     // ici seulement les méthodes qu'on a besoin
    }
    Si tu as besoin de faire un MouseMotionListener, ou encore un MouseWheelListener, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MouseAdapter mouseAdapter=new MouseAdapter() {
     
         // ici seulement les méthodes qu'on a besoin
    };
    addMouseListener(mouseAdapter);
    addMouseMotionListenrer(mouseAdapter);
    addMouseWheelListener(mouseAdapter);
    Et dans la classe, entre les accolades, on ne met que la ou les méthodes qu'on veut (en générale on en a pas besoin de toutes).

    En revanche, comme je l'ai dit, un javax.swing.Timer prend toujours un ActionListener et uniquement un ActionListener.
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    je suis completement perdu entre MouseListner et MouseAdapter et actionListener
    peux tu jetter un coup d'oeil sur mon code?

    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
    import java.io.*;
    import java.net.URL;
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.Timer;
    public class PanneauDeCartes extends JPanel  {
     
    	private int nRangees, nColonnes, delai0, delai1;
     
    	private ImageIcon image, dos;
    	Timer t;
    	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);
     
     
    		for(int i =0;i<nRangees*nColonnes; i++){
    			this.add(cartes[i]);
    			cartes[i].addMouseListener(new MouseAdapter(){
    				public void mouseClicked(MouseEvent e) {
    					   ((Carte)e.getSource()).retourne();
    					   t = new Timer(2000,new ActionListener(){
    						   public void actionPerformed(ActionEvent e){
    							   ((Carte)e.getSource()).cache();
    						   }
    					   }).start();		
    				}
    				});
    		}
    	}
    il me donne l'erreur: can't convert from void to Timer

  12. #12
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    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
    import java.io.*;
    import java.net.URL;
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.Timer;
    public class PanneauDeCartes extends JPanel  {
     
    	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);
     
     
    		for(int i =0;i<nRangees*nColonnes; i++){
    			this.add(cartes[i]);
    			cartes[i].addMouseListener(new MouseAdapter(){
                            	Timer t;
    				public void mouseClicked(MouseEvent e) {
                                               if ( t!=null ) t.stop(); // pour éviter qu'il y ait plusieurs timers si on clique plusieurs fois sur la carte
    					   ((Carte)e.getSource()).retourne();
    					   t = new Timer(2000,new ActionListener(){
    						   public void actionPerformed(ActionEvent e){
    							   ((Carte)e.getSource()).cache();
    						   }
    					   });
                                               t.setRepeats(false); // j'avais oublié de te préciser de faire ça pour que ça ne répète pas continuellement
                                               t.start();		
    				}
    				});
    		}
    	}
    Il faudrait peut être que tu prévois de ne pas appeler retourne() si la carte est déjà retournée : là, ce que ça va faire, c'est prolonger la durée de retournement avant que la carte se cache.
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    Apparemment le caste que j'utilise n'est pas bon.
    e.getSource() me retourne une référence de type object, voila pourquoi j'utilise un cast pour appeler mes fonction qui sont dans la classe Carte, mais ça me donne ces messages:

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.Timer cannot be cast to Carte
    at PanneauDeCartes$1$1.actionPerformed(PanneauDeCartes.java:30)
    at javax.swing.Timer.fireActionPerformed(Unknown Source)
    at javax.swing.Timer$DoPostEvent.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
    as tu une idée sur ce que ça peut être

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    J'ai résolu le problème, mais j'ai une autre question si ça ne te dérange pas
    j'essaie de traiter le cas du deuxième clic et j'obtiens un tas de messages d'erreur et je ne vois pas ou est le problème
    voici le nouveau code:

    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
     
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.Timer;
    public class PanneauDeCartes extends JPanel  {
     
    	private int nRangees, nColonnes, delai0, delai1, nbClics=1;
     
    	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);
     
     
    		for(int i =0;i<nRangees*nColonnes; i++){
    			this.add(cartes[i]);
    			cartes[i].addMouseListener(new MouseAdapter(){
    				CarteCouleur c1;
    				Timer t;
    				public void mouseClicked(MouseEvent e) {
    					if(nbClics==1){
    						c1 =(CarteCouleur) e.getSource();
    						if(c1.estCachee()){
    							c1.montre();
    							nbClics++;
    						}
    					}
    					else if(nbClics==2){
    						CarteCouleur c2 =(CarteCouleur) e.getSource();
    						if( t!=null ) t.stop();
    						if((c2.getX()!=c1.getX()||c2.getY()!=c1.getY())&&c2.estCachee()){
    							c2.montre();
    							if(!c1.equals(c2)){
    							t = new Timer(2000,new ActionListener(){
    								public void actionPerformed(ActionEvent e){
    									c1.cache();
    									c2.cache();
    									repaint();
    									nbClics=1;
    								}
    							});
    							t.setRepeats(false);
    							t.start();		
    							}
    						}
    					}
    				}
    			});
    		}
    	}	
    }

  15. #15
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Quelles erreurs ?

    Ensuite, je ne sias pas ce que tu essayes de faire, mais ça ne va pas. Il y a un MouseAdapter par cartes, donc il ne reçoit des évenements que de cette carte : c1 et c2 ne peuvent être que la même carte. En revanche nbclics est commun à toute les cartes, donc j'ai l'impression que la première fois qu'on clique sur une carte, elle est montrée et elle le reste. Si on reclique dessus, il ne se passe rien (la carte n'est pas cachée). Si, à la place, on clique sur une autre carte, ça fait une NullPointerException parce que c1 n'est pas initialisée pour cette carte (et on accède c1.getX()).
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    effectivement il montre la première carte puis plus rien et ça me donne un nullpointerException plus 16 messages d'erreur que je ne comprend pas.
    sinon ce que j'essaies de faire est cela:
    si nbclics==1
    je montre la carte et je la mets dans c1
    j'incrémente le nbClics
    sinon si nbClics == 2
    je mets la carte(deuxième) dans c2 et je vérifie si je n'ai pas cliqué sur la meme carte avec getX et getY
    si ce n'est pas le cas je montre la carte c2 et je verifie si les cartes sont parailles
    si oui je fais rien, sinon je lance le timer pour les cacher après 2 secondes
    peut être que je m'y prend mal je ne sais pas qu'est ce tu en penses?

  17. #17
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je vois plus ou moins ce que tu fais techniquement et j'ai des hypothèses ce que tu voudrais faire. Mais je préfère que tu me dises que tu voudrais faire, fonctionnellement :

    1. une seule carte peut être visible à la fois: Si on clique sur une carte, ça la rend visible pour un temps déterminé. Si on clique sur une autre carte, ça cache celle qui est visible, et ça rend visible celle qu'on vient de cliquer pour un temps déterminé ;
    2. plusieurs cartes peuvent être visibles à la fois (un nombre quelconque ou maximum) : chaque fois qu'on clique sur une carte non visible, elle devient visible pour un temps déterminé. Chaque fois qu'on clique sur une autre carte non visible, elle devient visible pour un temps déterminé. Toutes les cartes visibles redeviennent non visible au même moment, ou chacune d'entre-elles se retournent au bout de son propre délai.
    3. fonctionnement à la "Memory" : la première carte cliquée reste visible. Quand on clique sur la seconde, elle reste visible si c'est la même que la première, sinon elle reste visible pour un délai, au bout duquel les 2 redeviennent visibles. On ne peut pas remettre invisible des cartes déjà appairées.
    4. ... autre ?
    5. Que se passe-t-il si on clique sur une carte déjà visible ? On prolonge le délai ou on la remet non visible ?
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    C'est le numéro 3 que je voudrais faire: fonctionnement a la memory
    au début toutes les cartes sont cachées.
    On click sur un carte et on la montre on click sur une deuxième, si les cartes sont parreilles on les laisses montrées sinon on les caches apres 2s
    un click sur une carte visible n'aura aucun effet.
    Bref j'imagine que tu connais le fonctionnement a la memory

  19. #19
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ok.

    Tout d'abord, au niveau modèle, il faut qu'une carte sache :

    • si elle est retournée ou pas : on peut gérer ça avec un état booléen (mettons visible=true/false)
    • si elle fait partie d'une paire trouvée ou pas : on gérer ça avec un état booléen (mettons trouvée=true/false)
    • à quelle autre carte elle correspond : un attribut "autre carte", de type CarteCouleur


    Un MouseAdapter unique, enregistré sur toutes les cartes. Ce MouseAdapter à un attribut carteVisible qui vaut null au début.
    Un attribut timer, à null au début
    Règles (chaque colonne contient la valeur à tester):
    clic sur carte (source de l'événement) visible trouvée mouseAdapter.carteVisible timer Ce qu'on fait
    false false null null carte.visible=true
    mouseAdapter.cartevisible=carte
    - (- = peu importe, donc on ne teste pas) true - - rien faire
    carte.autreCarte==mouseAdapter.carteVisible false false !null null carte.visible=true
    => paire trouvée
    on incrémente le score...
    mouseAdapter.cartevisible=null
    carte.autreCarte!=mouseAdapter.carteVisible false false !null null carte.visible=true
    => mauvaise correspondance
    timer = new Timer()

    carte1=mouseAdapter.carteVisible
    carte2=carte
    au bout de 2 s :
    carte1.visible=false
    carte2.visible=false
    timer=null
    mouseAdapter.carteVisible=null
    lancer timer

    ça c'est pour la base. Maintenant, il faut choisir :
    1. soit pendant le timer on ne peut pas cliquer sur une nouvelle carte pour la rendre visible (cas simple)
    2. soit on peut continuer à jouer le temps que les cartes mal appairées attendent de se retourner (moins simple)


    Pour que le cas 1, on ajoute juste ces règles :

    clic sur carte (source de l'événement) visible trouvée mouseAdapter.carteVisible timer ce qu'on fait
    - - - !null on fait rien (timer en cours)
    true false - null => une seule carte visible !
    mouseAdapter.carteVisible=null
    carte.visible=false


    Pour le cas 2, je pense que le plus simple soit que chaque carte ait son propre timer (le timer devient un attribut de la carte). Ceci permet de l'annuler lorsqu'on clique sur une carte encore visible pour démarrer une nouvelle tentative de recherche de paire. le reste ne change pas.
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    un très grand merci,
    je vais essayer de mettre tout ça en œuvre et je te reviendrai
    sinon je veux juste faire le cas 1 (plus simple pour toi!!)
    merci encore c'est très apprécié

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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