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

Composants Java Discussion :

JPanel & getGraphics() : NullPointerException


Sujet :

Composants Java

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut JPanel & getGraphics() : NullPointerException
    Bonsoir,

    lors d'un appel à un getGraphics() sur un JPanel qui vient d'être instancié, je reçois une variable null. Comment est-ce possible, et surtout, comment y remédier ?

    Voici 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
    public class GameScreen extends JPanel
    {
        public GameScreen(Image img)
        {
            super();
            setLayout(null);
            setPreferredSize(SCREEN_SIZE);
            setBackground(Color.BLACK);
     
            Graphics g = this.getGraphics();
     
            g.drawImage(img, 0, 0, Color.BLACK, this);
        }
    }
    Un grand merci à ceux qui pourront m'aider à résoudre ce souci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    c'est très simple:

    lorsque tu crée ton JPanel, il est réservé en mémoire mais pas encore ajouté à la fenêtre. Tu ne peux donc pas dessiner dedans !

    Il faut attendre de l'afficher réellement avant de pouvoir dessiner !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class MaClasse extends JFrame
      public MaClasse(){
        /* un peu de code ...*/
     
        show();
        JPanel pan = new JPanel();
     
        pan.getGraphics.drawString("blabla"); // <- NullPointerException
     
        this.add(pan);
        pan.getGraphics.drawString("blabla"); // <- pas d'exception
      }
    essaie en faisant comme ça, je pense que ça va marcher

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Ca a l'air de marcher, mais seulement si je mets mes méthodes repaint et update en commentaire ... (dans la classe étendant le JPanel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void repaint()
        {
            paint(getGraphics());
        }
     
        public void update(Graphics g)
        {
            paint(g);
        }
    Est-ce normal ? Je suis en train de développer un petit jeu, et si je n'utilise pas ces méthodes, j'ai des problèmes de scintillement ...

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    que se passe-t-il lorsque tu ne les mets pas en commentaires ?

    si c'est de nouveau un NullPointerException, c'est sans doute parce que tu appelles ces méthodes avant d'afficher ton JPanel (par exemple dans le constructeur de ta classe qui étend JPanel).

    Tu aurais meilleur temps de l'appeler dans le constructeur de la fenêtre

    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
     
    class MonJPanel extends JPanel{
      public MonJPanel (){
        setDoubleBuffered(true); // <- pr limiter le scintillement
      }
     
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        // à faire lors de la MàJ du panel
      }
    }
     
     
    class MaJFrame extends JFrame{
      public MaJFrame(){
        MonJPanel pan = new MonJPanel();
        this.add(pan);
        pan.paintComponent(pan.getGraphics());
        pan.update();
        ........
      }
    }

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Je n'y comprends plus rien ...

    Voici mon code. J'ai tout mis en commentaire sauf ce qui est visible ici :

    MonPanel.java
    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
    public class MonPanel extends JPanel
    {
        public MaFrame()
        {
            super();
        }
     
        synchronized protected void paintComponent(Graphics g)
        {
            g.drawImage(
                Toolkit.getDefaultToolkit().getImage(".data/img/image.png"),
                0,
                0,
                Color.BLACK,
                this);
        }
     
        public void repaint()
        {
            paintComponent(getGraphics());
        }
     
        public void update(Graphics g)
        {
            paintComponent(g);
        }
     
    }
    MaFrame.java
    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 MaFrame extends JFrame implements GameConstants
    {
        private JPanel mainPanel;
     
        public MaFrame()
        {
            super();
            this.setSize(SCREEN_SIZE);
            this.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent we)
                {
                    System.exit(1);
                }
            });
     
            this.show();
            mainPanel = new MonPanel();
            this.add(mainPanel);
            mainPanel.paintComponents(mainPanel.getGraphics());
        }
    }
    Je fais ça de manière très simple pourtant ... Rien de bien complexe ...

    Le panel doit être ajouté après l'appel à show() ? Je dois le redesssiner en permanence pourtant, d'où les surcharges des méthodes paintComponent(), repaint() et update() ...

    Apparemment, en faisant super() dans le constructeur de MonPanel(), il y a un appel à repaint() (vu la stacktrace). Normal ?

    Je rajoute quand même le stacktrace ici, histoire que vous y voyiez plus clair ...

    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
    java.lang.NullPointerException
    	at pack.gui.MonPanel.paintComponent(MonPanel.java:80)
    	at pack.gui.MonPanel.repaint(MonPanel.java:96)
    	at javax.swing.JComponent.setFont(Unknown Source)
    	at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
    	at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
    	at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
    	at javax.swing.JComponent.setUI(Unknown Source)
    	at javax.swing.JPanel.setUI(Unknown Source)
    	at javax.swing.JPanel.updateUI(Unknown Source)
    	at javax.swing.JPanel.<init>(Unknown Source)
    	at javax.swing.JPanel.<init>(Unknown Source)
    	at javax.swing.JPanel.<init>(Unknown Source)
    	at pack.gui.MaFrame.<init>(MonPanel.java:48)
    	at pack.gui.MonPanel.<init>(MaFrame.java:56)
    	at pack.Application.main(Application.java:33)
    Exception in thread "main"

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    oui, c'est mieux d'ajouter le panel après le show(), pour des raisons de NullPointerException.

    Concernant ton code, il me semble tout à fait correct. J'ai juste un peu de peine à comprendre à quoi te servent les redéfinitions de repaint() et update()... puisqu'elles appelent toutes les deux paintComponent() ! (autant appeler directement paintComponent() )

    Mais sinon, c'est exactement ce que je te disais plus haut


    [EDIT]
    essaie d'enlever le super() du constructeur de ton JPanel....
    [/EDIT]

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    J'ai repris ton squelette, et ça marche nickel. J'ai beau comparer mon code et le tien, je ne vois rien de dissemblable ...

    Enfin, le principal est que ça marche maintenant

    merci beaucoup

  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    De rien !

    A une prochaine

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

Discussions similaires

  1. marges de JPanel
    Par cmoulin dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 10/05/2004, 15h21
  2. Pb scintillement-stabilité lors réaffichage de JPanel
    Par Pill_S dans le forum Composants
    Réponses: 5
    Dernier message: 28/04/2004, 14h03
  3. Listener sur un JPanel
    Par ptitelfe dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 27/03/2004, 13h14
  4. JPanel et Border
    Par titoine dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2003, 15h58

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