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

Graphisme Java Discussion :

probleme avec paint(Graphics g)


Sujet :

Graphisme Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 48
    Par défaut probleme avec paint(Graphics g)
    Bonjour,

    j'espère ne pas me tromper de rubrique, mais si c'est le cas, excusez-moi.

    Je vous mets dans le contexte afin de mieux cerner le probleme.

    Je suis en train de faire un jeu en graphique (joueur Rouge et joueur Jaune) et pour question de simplicité, les cases de la grille du jeu sont des petits JPanel dans lesquels je dois tracer des traits au moment d'un clic par exemple.

    Et je précise aussi que j'implémente une Intelligence Artificielle.

    La classe du joueur Ordinateur possède une fonction :
    Coup play(Coup a)

    A chaque partie, le joueur Rouge commence.
    Deux façons différentes de commencer :
    1) L'ordinateur est Rouge, donc il doit commencer la partie, du coup on appelle :
    joueurOrdi.play(null);

    2) L'ordinateur est Jaune, donc c'est l'utilisateur (le joueur Rouge) qui doit commencer la partie. Du coup, apres le clic, on lancera :
    jeu(joueurOrdi.play(coupUtilisateur));


    Le probleme arrive lorsque le joueur Ordinateur est Rouge.
    Ca me met :
    Exception in thread "main" java.lang.NullPointerException
    at Connexion.jeu(Connexion.java:316)

    La ligne 316 correspond à :
    clic[i][j].paint(g);

    Mais quand le joueur Ordinateur est Jaune, il n'y a aucun probleme.

    Voici la fonction qui a du mal avec paint(Graphics g) :
    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
     
    public void jeu(Coup coup)
    {
    	Coup coupJoueurOrdi = coup;
     
    	if (couleurJoueurOrdi.equals("ROUGE"))
    	{
    		if (coupJoueurOrdi.i1 == coupJoueurOrdi.i2)
    		{
     
    			int i=coupJoueurOrdi.i1*2-1;
    			int j=coupJoueurOrdi.j1*2-1;
     
    			if (clic[i][j].getOk()==1)
    			{					
    				Graphics g=clic[i][j].getGraphics();
    				clic[i][j].setOk(2);
    				clic[i][j].trace(i,j,"RougeHorizontal");
     
    				clic[i][j].paint(g);
     
    			}
    		}
    		else if (coupJoueurOrdi.i1 != coupJoueurOrdi.i2)
    		{
    			int i=coupJoueurOrdi.i1*2;
    			int j=coupJoueurOrdi.j1*2-2;
     
    			if (clic[i][j].getOk()==1)
    			{
    				Graphics g=clic[i][j].getGraphics();
    				clic[i][j].setOk(2);
    				clic[i][j].trace(i,j,"RougeVertical");
     
                                    clic[i][j].paint(g);
    			}
    		}
    		numJoueur=2;
    	}
    	else if (couleurJoueurOrdi.equals("JAUNE"))
    	{
    		if (coupJoueurOrdi.i1 == coupJoueurOrdi.i2)
    		{
    			int i=coupJoueurOrdi.i1*2-2;
    			int j=coupJoueurOrdi.j1*2;
     
    			if (clic[i][j].getOk()==1)
    			{
    				System.out.println("if (clic[i][j].getOk()==1)");
    				Graphics g=clic[i][j].getGraphics();
    				clic[i][j].setOk(2);
    				clic[i][j].trace(i,j,"JauneHorizontal");
     
    				clic[i][j].paint(g);
    			}
    		}
    		else if (coupJoueurOrdi.i1 != coupJoueurOrdi.i2)
    		{
    			int i=coupJoueurOrdi.i1*2-1;
    			int j=coupJoueurOrdi.j1*2-1;
     
    			if (clic[i][j].getOk()==1)
    			{
    				Graphics g=clic[i][j].getGraphics();
    				clic[i][j].setOk(2);
    				clic[i][j].trace(i,j,"JauneVertical");
     
    				clic[i][j].paint(g);
     
    			}
    		}
    		numJoueur=1;
    	}
    }
    Et cette fonction, je l'appelle avec ça au départ :
    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
     
    if (couleurJoueurOrdi.equals("ROUGE"))
    {
    	joueurOrdi=new Joueur(taille,couleurJoueurOrdi,false);
    	coupUtilisateur=new Coup();
    	numJoueur=1;
    	coupUtilisateur=joueurOrdi.play(null);
     
    	jeu(coupUtilisateur);
    }
    else if (couleurJoueurOrdi.equals("JAUNE"))
    {
    	joueurOrdi=new Joueur(taille,couleurJoueurOrdi,false);
    	coupUtilisateur=null;
    	numJoueur=1;
    }

    J'espere que vous arriverez à m'aider.

  2. #2
    Membre éprouvé Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Par défaut
    Le problème ne vient pas du paint mais plutôt du Graphics g que tu passes en paramètre, ce dernier semble non initialisé.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Il ne faut pas utiliser la methode getGraphics() d'un JComponent pour dessiner a l'ecran. Il faut surcharger la methode paintComponent() de ce composant.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 48
    Par défaut
    Psyphi : Toutes mes cases (JPanel) sont initialisées et je leur affecte un fond noir au départ. Pour cette étape, c'est bon. Donc normalement le Graphics g est forcément défini non ?

    Bouye : Dans mon autre classe Clic (un Clic est une case donc un JPanel), j'ai surchargé la méthode paint seulement. Mais sinon, pour la surcharge de la méthode paintComponent(), ca se fait de quelle maniere ? Et comment l'utilise-t-on ?

    Voici ma méthode paint(Graphics g1) :
    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
     
    public void paint(Graphics g1)
    {
         g1.setColor(Color.BLACK);
         g1.fillRect(0,0,31,31);
     
         if(ok==2)
         {
             if (trait.equals("RougeHorizontal"))
             {
                 g1.setColor(Color.RED);
                 g1.fillRect(0, (31/2)-3, 31, 6);
             }
             else if(trait.equals("RougeVertical"))
            {
                 g1.setColor(Color.RED);
                 g1.fillRect((31/2)-3, 0, 6, 31);
             }
             else if (trait.equals("JauneHorizontal"))
             {
                 g1.setColor(Color.YELLOW);
                 g1.fillRect(0, (31/2)-3, 31, 6);
             }
             else if(trait.equals("JauneVertical"))
             {
                 g1.setColor(Color.YELLOW);
                 g1.fillRect((31/2)-3, 0, 6, 31);
             }
     
             ok=0;
         }
     }

    Voici le screen du programme au démarrage : http://img189.imageshack.us/img189/4747/screenhd.jpg

    Et voici le screen de ce que je voudrais avoir au démarrage : http://img32.imageshack.us/img32/9628/screenattendu.jpg

    (Ne faites pas attention à l'image du joueur courant dans la colonne de droite)

    Vous voyez bien que le fond est de la bonne couleur mais le trait ne se met pas. Par contre, la case porte bien le numéro du joueur et pas zéro (le tableau 2D de marquage des cases est initialisée à zéro pour toutes les cases et je mets 1 ou 2 selon le numéro du joueur). Donc il y a juste le pb avec le tracage du trait.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 48
    Par défaut
    Bon, apres plusieurs manipulations, tests et bidouilles, je suis arrivé au résultat voulu. J'ai finalement surchargé la méthode paintComponent. Et pour qu'il me trace le trait en début de partie, je n'ai pas appelé paintComponent(Graphics g). Mais pour tous les autres coups suivants, je l'ai appelé. Et je ne sais pour quelle raison, ca fonctionne comme je le souhaite.
    Alors c'est cool.


    Donc un probleme résolu ! Yeah !
    Merci à vous deux.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Dans Swing, paint(g) appelle en fait 3 autres méthodes qui sont bien spécifiques :
    • paintComponent(g) est la méthode qui dessine le composant lui-même. C'est cette méthode qu'il faut surcharger pour dessiner un composant custom.
    • paintChildren(g) dessine tous les composants enfants qui ont été ajoutés dans ce composant.
    • paintBorder(g) dessine le Border qu'on peut mettre autour de n'importe quel JComponent.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Réponses: 28
    Dernier message: 09/09/2010, 17h27
  2. probleme avec la classe Graphics
    Par sky88 dans le forum Débuter
    Réponses: 5
    Dernier message: 24/08/2008, 19h45
  3. problemes d'affichage avec paint
    Par Agrapheuse dans le forum Applets
    Réponses: 5
    Dernier message: 17/10/2007, 14h14
  4. Probleme avec Canvas et son Graphics
    Par sikoko dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/02/2007, 17h29
  5. Problème avec les évènements Paint
    Par vdumont dans le forum wxWidgets
    Réponses: 1
    Dernier message: 11/04/2006, 22h25

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