Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Bonjour,

Mon but est de programmer une fenêtre dans laquelle je peux remplir les caractéristiques d'un point ( nom abscisse et ordonnée). Je veux ensuite que mon point s'affiche dans un panneau. Quand je lance mon programme, je rencontre cette erreur :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at projet_interface_graphique.Fenetre_Point.ok(Fenetre_Point.java:148)
at projet_interface_graphique.Fenetre_Point.access$000(Fenetre_Point.java:14)
at projet_interface_graphique.Fenetre_Point$1.actionPerformed(Fenetre_Point.java:62)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)

(il y a d'autres lignes mais il me semble que seules les premières sont importantes)

Dans la classe Fenetre-Point j'ai :
    int abs, ord;
    Panneau pane;
    Graphics g;
    private void ok(java.awt.event.ActionEvent evt) {                    
        nom = idPoint.getText();
        String s1 = abscisse.getText();
        abs = Integer.parseInt(s1);
        String s2 = ordonnee.getText();
        ord = Integer.parseInt(s2);
        pane.paintComponent( g, abs, ord); // <-- c'est cette ligne qui pose problème 
        dispose(); 
    }

Dans la classe Panneau :
public class Panneau extends JPanel {
    JPanel panel;
    public Panneau(){
        panel = new JPanel();
    }
    public void paintComponent(Graphics g, int abs, int ord) {
        super.paintComponent(g);
        g = getGraphics();
        Projet_interface_graphique.dessinPoint(g, abs, ord );
        repaint();
    }
}

et enfin dans la classe Projet_interface_graphique :
public class Projet_interface_graphique {

    
    //lance le programme
    public static void main(String args[]) {
        Fenetre fen = new Fenetre();
        fen.setVisible(true);

    }
    
    static void dessinPoint(Graphics g, int x, int y) {
        g.setColor(Color.GREEN);
        g.drawOval(x, y, 10, 10);
    }
}

Pouvez-vous m'indiquer quelle est mon erreur ? Je pense que ça vient de g mais je n'ai pas bien compris ce qu'est un graphics et je ne sais pas comment l'initialiser.

Merci beaucoup
Afficher la suite 

1 réponse

Messages postés
16010
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 août 2019
86
0
Merci
Bonjour,

Un NullPointerException sur
pane.paintComponent(g, abs, ord);
c'est forcément parce que
pane == null
.
Si le problème était sur g, abs ou ord, l'exception aurait eu lieu dans Panneau, pas dans Fenetre_Point.

Et si pane vaut null, c'est parce que tu ne fais jamais de
pane = new Panneau();
KX
Messages postés
16010
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 août 2019
86 > Gaaile
Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Ton code est incomplet, mais lorsque tu fais
pane.paintPoint( g, abs, ord);
que vaut
g
?

Je pense que ta méthode paintPoint ne devrait pas exister.
Il faudrait que j'ai le code complet et quelques explications pour comprendre ce que tu essaies de faire car à mon avis tu es parti du mauvais pied...
Gaaile
Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Voici mon code complet :

package projet_interface_graphique;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
 *
 * @author Gaëlle
 */
public class Projet_interface_graphique {
    //lance le programme
    public static void main(String args[]) {
        Fenetre fen = new Fenetre();
        fen.setVisible(true);
    }
    static void dessinPoint(Graphics g, int x, int y) {
        g.setColor(Color.GREEN);
        g.drawOval(x, y, 10, 10);
    }
}

package projet_interface_graphique;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
 *
 * @author Gaëlle
 */
public class Fenetre extends JFrame{
    //attributs de la classe 
    private JPanel panneau;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenu creation;
    private javax.swing.JMenuItem point;
    //constructeur de la Frame
    Fenetre() {
        //Initialise les composants
        initComponents();
        // titre de la fenêtre
        setTitle("Dessin 2D");
        //taille écran
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension dimEcran = tk.getScreenSize();
        int largeur = dimEcran.width;
        int hauteur = dimEcran.height;
        setSize(largeur, hauteur);
        //ajoute le panneau à la fenêtre (frame)
        panneau = new Panneau();
        getContentPane().add(panneau);
    }
    //initialisation des composants
    private void initComponents() {
        // Barre menu
        jMenuBar1 = new javax.swing.JMenuBar();
        //option dans barre menu
        creation = new javax.swing.JMenu();
        jMenuBar1.add(creation);
        creation.setText("Création");
        //option dans création (Point)
        point = new javax.swing.JMenuItem();
        point.setText("Point");
        creation.add(point);
        point.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pointActionPerformed(evt);
            }
        });
    }
}

package projet_interface_graphique;
import java.awt.Graphics;
/**
 *
 * @author Gaëlle
 */
public class Fenetre_Point extends javax.swing.JFrame {
    String nom;
    int abs, ord;
    Projet_interface_graphique projet;
    Graphics g ;
    Panneau pane ;
    /**
     * Creates new form Fenetre_Point
     */
    public Fenetre_Point() {
        initComponents();
    }
        setJMenuBar(jMenuBar1);
        pack();
    }
    //Clic sur point 
    private void pointActionPerformed(java.awt.event.ActionEvent evt) {                                      
        System.out.println("Clic sur Créer un Point");
        Fenetre_Point fenPoint=new Fenetre_Point();
        fenPoint.setVisible(true);
    }
}
private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        ok = new javax.swing.JButton();
        annuler = new javax.swing.JButton();
        idPoint = new javax.swing.JTextField();
        abscisse = new javax.swing.JTextField();
        ordonnee = new javax.swing.JTextField();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("Point");
        jLabel2.setText("Nom Point");
        jLabel3.setText("Abscisse");
        jLabel4.setText("Ordonnée");
        ok.setText("OK");
        ok.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ok(evt);
            }
        });
        annuler.setText("Annuler");
        annuler.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                annuler(evt);
            }
        });
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(38, 38, 38)
                        .addComponent(ok)
                        .addGap(30, 30, 30)
                        .addComponent(annuler))
                    .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(19, 19, 19)
                                .addComponent(jLabel2))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING))))
                        .addGap(30, 30, 30) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(idPoint, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)
                            .addComponent(abscisse)
                            .addComponent(ordonnee)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(jLabel1)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(idPoint, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(abscisse, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(ordonnee, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(35, 35, 35).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ok)
                    .addComponent(annuler))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold> 
    private void ok(java.awt.event.ActionEvent evt) { 
        System.out.println("Clic sur OK");
        nom = idPoint.getText();
        String s1 = abscisse.getText();
        abs = Integer.parseInt(s1);
        String s2 = ordonnee.getText();
        ord = Integer.parseInt(s2);
        pane = new Panneau();
        pane.paintPoint( g, abs, ord);
        dispose(); 
        Point p = new Point();
        p.Point(nom, abs, ord);
        System.out.println(p);
//        this.M.ensemble.ajouteFigure(p);
//        System.out.println( this.M.ensemble.toString());
    }                   
    private void annuler(java.awt.event.ActionEvent evt) {                         
        System.out.println("Clic sur annuler");
        dispose();       
    }                     
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see [http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html] 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(Fenetre_Point.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {java.util.logging.Logger.getLogger(Fenetre_Point.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {java.util.logging.Logger.getLogger(Fenetre_Point.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(Fenetre_Point.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Fenetre_Point().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JTextField abscisse;
    private javax.swing.JButton annuler;
    private javax.swing.JTextField idPoint;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JButton ok;
    private javax.swing.JTextField ordonnee;
    // End of variables declaration  
}

package projet_interface_graphique;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
 *
 * @author Gaëlle
 */
public class Panneau extends JPanel {
    JPanel panel;
    public Panneau(){
        panel = new JPanel();
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);       
    }
    public void paintPoint(Graphics g, int abs, int ord){
        super.paintComponent(g);
        g = getGraphics();
        Projet_interface_graphique.dessinPoint(g, abs, ord );
        repaint();   
    }
}

package projet_interface_graphique;
/**
 *
 * @author Gaëlle
 */
public class Point  {
    //Attributs de la classe 
    public double px;
    public double py;
    //Fin attributs
    //Début méthodes
    //afficher point  ( De la forme id=(px,py) )
    public String toString() {
        return "Point-" + super.idFigure + "-" + this.px + "-" + this.py;
    }
    //Fin (afficher point)
    //Création par défaut Point
    public void Point() {
        super.idFigure = "erreur";
        this.px = 0;
        this.py = 0;
    }
    //Fin (Création par défaut Point)
    // Création Point à partir de données déjà entrées
    public void Point(String idPoint, double px, double py) {
        super.idFigure = idPoint;
        this.px = px;
        this.py = py;
    }
    //Fin (Création Point à partir de données déjà entrées)
    //Création d'un point par l'utilisateur
    public Point creerPoint() {
        System.out.println("Pour créer un point, saisissez les informations suivantes : ");
        System.out.println("Identifiant : ");
        super.idFigure = Lire.S();
        System.out.println("Abscisse : ");
        this.px = Lire.d();
        System.out.println("Ordonnée : ");
        this.py = Lire.d();
        Point P = new Point();
        P.Point(super.idFigure, this.px, this.py);
        return P;
    }
    //Fin (Création d'un point par l'utilisateur)
    //abscisse max et min et ordonnée max et min
    public double MaxX() {
        return (this.px);
    }
    public double MinX() {
        return (this.px);
    }
    public double MaxY() {
        return (this.py);
    }
    public double MinY() {
        return (this.py);
    }
    //Fin (abscisse max et min et ordonnée max et min)
    //Distance entre un point et un autre point (ici entre deux points : le point de coordonnée px et py et le Point de reférence )
    public double DistancePoint(Point pointRef) {
        return (Math.sqrt(Math.pow((px - pointRef.px), 2) + Math.pow((py - pointRef.py), 2)));
    }
    //Fin (Distance Point/Point)
    public String Affiche() {
        String c;
        c = this.toString() + " Max X = " + MaxX() + " Min X = " + MinX() + " Max Y = " + MaxY() + " Min Y = " + MinY();
        return c;
    }
}

Pour les explications : ma classe Point est bonne, toutes ses méthodes fonctionnent donc pas de soucis de ce côté là. J'ai créé Fenetre_Point à partir des aides de netbeans ce qui explique les longues lignes de présentation de la fenêtre : c'est automatique.
Le but du projet est de créer une interface graphique : de créer des points et des segments à partir des données entrées par l'utilisateur. Tous les points et segments doivent apparaître dans le même panneau qui est sur la fenêtre principale (Fenetre).
KX
Messages postés
16010
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 août 2019
86 > Gaaile
Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Ton "code complet" ne compile pas, notamment la classe Point qui définit une valeur super.idFigure alors que Point n'hérite d'aucune classe...

Je regarderais le code en détail, mais sans pouvoir le tester c'est plus compliqué !
Gaaile
Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Bonjour, j'ai refais mon programme autrement et maintenant j'arrive à dessiner un point et j'ai encore deux problèmes, la fenetre point s'affiche dans mon panneau quand je valide et les points s'effacent quand j'en remet un nouveau

Voici mon programme :

classe principale :
package nouveau;

/**
 *
* @author Gaëlle
*/
public class Nouveau {

    public static void main(String args[]) {
        Fenetre fen = new Fenetre();
        fen.setVisible(true);
    }

}

fenetre :
package nouveau;
import javax.swing.JFrame;

/**
 *
* @author Gaëlle
*/
public class Fenetre extends JFrame {

    //attributs de la classe 
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenu creation;
    private javax.swing.JMenuItem afficher;
    private javax.swing.JMenuItem point;
    public static Panneau pan = new Panneau();

    public Fenetre() {
        //Initialise les composants
        initComponents();
        //titre fenetre
        this.setTitle("Dessin");
        //taille fenetre
       this.setSize(1000, 1000);
        //ferme programme en fermant la fenetre
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //ajoute le panneau au Content Pane
        this.setContentPane(pan);
    }
    
    //initialisation des composants
    private void initComponents() {
        // Barre menu
        jMenuBar1 = new javax.swing.JMenuBar();
        //option dans barre menu
        creation = new javax.swing.JMenu();
        jMenuBar1.add(creation);
        creation.setText("Création");
        //option dans création (Point)
        point = new javax.swing.JMenuItem();
        point.setText("Point");
        creation.add(point);
        point.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pointActionPerformed(evt);
            }
        });
        setJMenuBar(jMenuBar1);
        pack();
    }

    //Clic sur point 
    private void pointActionPerformed(java.awt.event.ActionEvent evt) {
        System.out.println("Clic sur Créer un Point");
        FenetrePoint fenPoint = new FenetrePoint();
        fenPoint.setVisible(true);
    }
}

panneau :
package nouveau;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

/**
 *
* @author Gaëlle
*/
class Panneau extends JPanel {

    public int posX = -50;
    public int posY = -50;

    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillOval(posX, posY, 10, 10);
    }

    public int getPosX() {
        return posX;
    }

    public void setPosX(int posX) {
        this.posX = posX;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int posY) {
        this.posY = posY;
    }
}


Fenetre Point : (Je l'ai refaite en manuel avec ce que j'avais fais avec le logiciel précédement)

package nouveau;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

/**
 *
* @author Gaëlle
*/
class Panneau extends JPanel {

    public int posX = -50;
    public int posY = -50;

    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillOval(posX, posY, 10, 10);
    }

    public int getPosX() {
        return posX;
    }

    public void setPosX(int posX) {
        this.posX = posX;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int posY) {
        this.posY = posY;
    }
}

Merci pour tes réponses
KX
Messages postés
16010
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 août 2019
86 > Gaaile
Messages postés
4
Date d'inscription
mercredi 26 décembre 2018
Statut
Membre
Dernière intervention
29 décembre 2018
-
Tu as mis deux fois la classe Panneau, il manque encore la classe FenetrePoint, du coup quand je démarre le programme et que je clique sur Point dans le menu, je ne sais pas ce qu'il se passe...
Commenter la réponse de KX