Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] Problème avec la classe Graphics

java.lang.NullPointerException o_O

Sujet résolu
    31 janvier 2006 à 18:49:12

    Bonjour à tous,

    Je fais du Java depuis quelques mois maintenant mais je profite de cette semaine de congé pour approfondir ma connaissance du Java en tentant de comprendre comment implanter des images dans mes programmes Java et autres fonctionnalités de dessin à la souris. ^^
    Dans ce que j'ai esasyé, j'ai voulu représenter un jeu avec une carte et un personnage dans le PanneauET.

    J'ai donc créé une fenêtre avec une barre de menus et deux panels: PanneauMenu et PanneauET (ET pour Espace de Travail). Jusque là, niquel.
    Seulement, je voudrais pouvoir mettre des images ou dessiner dans le panel PanneauET. J'ai donc essayé ça:

    import java.awt.*;
    import java.awt.event.*;

    public class Helium
    {
            public static void main(String args[])
            {
                    Helium H=new Helium();//le main lance l'objet Helium
            }
           
            public Helium()//constructeur d'Helium
            {
                    Frame Lafenetre=new Frame("Projet Helium");//on créée une nouvelle fenêtre (Frame Lafenetre) avec le titre du projet en paramètre
                    Lafenetre.setSize(1200,900);//donne la taille de Lafenetre
                    Lafenetre.setLocation(100,100);//donne la position de Lafenetre
                    Lafenetre.addWindowListener(new WindowAdapter()
                    {
                            public void windowClosing(WindowEvent event)
                            {
                                    System.exit(0);
                            }
                    });//permet de fermer Lafenetre en cliquant sur la croix sur fond rouge
                    Lafenetre.setLayout(new BorderLayout());//Layout du type Border, qu'on subdivisera
                   
                    //Création des Panel PanneauMenu et PanneauET
                    PanneauMenu Est=new PanneauMenu();
                    Lafenetre.add(Est,BorderLayout.EAST);
                    Est.setSize(100,100);
                    Est.setVisible(true);
                         
                    PanneauET Centre=new PanneauET();//création de deux panels pour séparer le menu (à l'est) de l'espace de travail (au centre)
                    Lafenetre.add(Centre,BorderLayout.CENTER);//positionnement des 2 panels
                   
                    //création de la barre de menu   
                    MenuBar LaBarre = new MenuBar();
                    Menu programme = new Menu("Programme");//Un menu pour la gestion du programme en lui-même
                    LaBarre.add(programme);
                    Menu  interactions = new Menu("Interactions");//un menu pour interagir dans le programme
                    LaBarre.add(interactions);
                    Menu aide = new Menu("Aide");//un menu proposant diverses aides
                    LaBarre.add(aide);
                    Lafenetre.setMenuBar(LaBarre);//installation de la barre
           
                    MenuItem Quitter= new MenuItem("Quitter");
                    Quitter.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent event)
                    {System.exit(0);}});
                    programme.add(Quitter);
                 
                    //J'appelle la fonction paint de Centre pour que des dessins soient faits dans Centre
                    Centre.paint(Centre.getGraphics()/*leperso*/); <couleur nom="rouge">//ça foire à cet endroit</couleur>

                    Lafenetre.setVisible(true);//Lafenetre doit s'afficher
            }
    }

    Ca, c'est la classe principale.
    J'ai placé les classes PanneauMenu et PanneauET dans des classes à part pour soulager un peu la classe principale (c'est déjà fort lourd comme ça :-° )

    Voici la classe PanneauET, les autres classes ne posant pas de problème:
    import java.awt.*;



    public class PanneauET  extends Panel//extends JInternalFrame
    {
             private Image persoImage;
             
             PanneauET()
             {
                     this.setBackground(java.awt.Color.gray);
             }
             public void paint(/*Personnage leperso*/Graphics g)
             {
                    /*persoImage=leperso.getImage();
                     g.drawImage(persoImage,100,100,10,10,this);*/
    <couleur nom="rouge">//mis en commentaire car ça foire</couleur>
                     //g.drawLine(10,10,0,0); <couleur nom="rouge">//j'ai essayé ceci mais ça foire aussi</couleur>
                     System.out.println(g.toString());<couleur nom="rouge">//même ça, ça foire</couleur>
             }
    }


    L'erreur renvoyé est celle-ci (sous Eclipse):
    Exception in thread "main" java.lang.NullPointerException
    at PanneauET.paint(PanneauET.java:18)
    at Helium.<init>(Helium.java:63)
    at Helium.main(Helium.java:9)


    Si je ne mets rien dans la méthode paint concernant le Graphics g, aucune erreur n'est affichée et tout se passe bien.
    Quelqu'un pourrait-il m'aider à résoudre ce petit problème s'il-vous-plaît? Les nombreux tutos que j'ai lu à ce sujet ne m'ont pas aidés car ils réexpliquent tous la même chose, mais ce n'est jamais ce que je cherche à savoir. :euh:

    Merci d'avance à ceux qui prendront la peine! ;)
    Raton

    PS: Je suis honteux là: j'ai résolu mon propre problème. :honte:
    J'ai trouvé en fait qu'en ne cherchant pas à appeler la péthode paint(Graphic g) depuis l'extérieur, tout se passe bien. >_<
    En virant la ligne "Centre.paint(Centre.getGraphics()/*leperso*/);" de la classe Helium, ça a fini par marcher.
    J'en déduis donc que la méthode paint() de toute classe est appelée automatiquement. (je le mets en gras pour que d'autres le voient rapidement s'ils ont le même problème que j'ai eu et s'ils parcourent ce forum)
    Une journée de recherche pour trouver ça.
    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2006 à 18:56:43

      Euh ... les <couleur = rouge> dans ton code c'est une rreur de Zér0c0de hein ?

      Ensuite, saches qu'il est déontologiquement interdit d'appeler directement la méthode paint d'un quelquonque objet. Elle est appelée automatiquement pour le premier dessin de son objet ; si tu désires redessiner l'objet, tu appelles plutot la méthode repaint().
      • Partager sur Facebook
      • Partager sur Twitter
        2 février 2006 à 22:14:05

        Les <couleur=rouge> sont en effet soit un petit foirage du Zérocode soit plus probablement une erreur de ma part. Je voulais simplement que les commentaires décrivant les endroits précis des problèmes apparaissent dans une couleur un peu plus prononcée que du gris. Tant pis... :-°

        Pour la suite de ton message, je t'avoue que je bidouille pour comprendre comment l'affichage de graphismes fonctionne. Pour mon problème, je n'avais d'ailleurs lu ça:

        Citation : Asgeir

        Elle est appelée automatiquement pour le premier dessin de son objet ; si tu désires redessiner l'objet, tu appelles plutot la méthode repaint().

        sur aucun tuto :) . j'ai beaucoup appris par les tutoriels mais ce détail-là, je ne l'avais vu nulle part.

        Dans la fin de mon message, tu pourras voir que j'ai rajouté un PS où je signale que j'ai viré cet appel de paint() pour que le dessin s'affiche.

        Merci d'avoir répondu à mon message, même si j'avais finalement trouvé moi-même comment le résoudre le bricoler pour qu'il fonctionne. :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2006 à 8:53:27

          fait deja ça
          System.out.println(g);
          au lieu de ça System.out.println(g.toString());
          car de toute maniere ce sera la methode toString qui sera appelé et au pire cela affichera null.

          pour l'appel de ta methode paint tu a inverser les parametres (perso puis G) et non l'inverse
          • Partager sur Facebook
          • Partager sur Twitter

          [Java] Problème avec la classe Graphics

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown