2014-05-18 3 views
-2

Je suis en train de développer un éditeur d'image en Java utilisant actuellement BufferedImage, JFrame et JPanel mais j'ai du mal à faire interagir mes boutons avec mon BufferedImage que j'ai lu dans un fichier. Voici mon code:Comment réparer une exception de pointeur nul

import java.awt.*; 
    import java.awt.Graphics; 

    import java.awt.event.*; 
    import javax.swing.*; 
    import java.io.*; 
    import javax.imageio.ImageIO; 
    import java.awt.image.BufferedImage; 
    import java.io.IOException; 



/** 
This class just holds the main 
*/ 
    public class ImageEditorDeluxe 
    { 
     public static void main(String[] args) 
     { 
     ProgramWindow p = new ProgramWindow(); 
     p.setBounds(100, 100, 500, 500); 
     p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     p.setVisible(true); 
     // p.pack(); 
     } 
    } 

/** 
This is where all of the JPanels will come together 
*/ 
    class ProgramWindow extends JFrame 
    { 
     ProgramWindow() 
     { 
     ImagePanel ip = new ImagePanel(); 
     ChooseFile cf = new ChooseFile(); 
     ButtonPanel bp = new ButtonPanel(ip.getImg()); 

     add(ip, BorderLayout.CENTER); 
     add(cf, BorderLayout.SOUTH); 
     add(bp, BorderLayout.WEST); 
     } 
    } 

/** 
This is where the image will be displayed 
*/ 
    class ImagePanel extends JPanel 
    { 
     BufferedImage img; 

     ImagePanel() 
     { 
     setBackground(Color.BLUE); //to test 
     final JButton button = new JButton ("Display picture"); 
     add(button);  

     ActionListener action = 
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        if (e.getSource()==button) 
        { 
        try 
        { 
         img = ImageIO.read(ChooseFile.getFile()); 
        } 
         catch(IOException f) 
         { 
          f.printStackTrace(); 
         } 

        repaint(); 

        } 
       } 

      }; 

     button.addActionListener(action); 
     } 

     public void paintComponent(Graphics g) 
     { 
     super.paintComponent(g); 
     if (img != null) 
      g.drawImage(img, 0, 0, this); 
     } 

     public void setImage(BufferedImage i) 
     { 
     img = i; 
     repaint(); 
     } 
     public BufferedImage getImg() 
     { 
      return img; 
     } 
    } 

/** 
This is where the JFileChooser will exist 
*/ 

    class ChooseFile extends JPanel 
    { 
     static File file; 
     JButton bOpen, bDisplay; 
     BufferedImage img; 


     ChooseFile() 
     { 
     setBackground(Color.GREEN); //to test 
     bOpen = new JButton("Open File"); 
     add(bOpen); 
     // bDisplay = new JButton("Display File"); 
     // add(bDisplay); 
     final JFileChooser chooser = new JFileChooser(); 


     ActionListener action = 
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
       //open file 
        if (e.getSource()==bOpen) 
        { 
        chooser.showOpenDialog(null); 
        file = chooser.getSelectedFile(); 
        } 
       //display file 
       /*  if (e.getSource()== bDisplay) 
        { 
        try 
        { 
         img = ImageIO.read(file); 
        } 
         catch(IOException f) 
         { 
          f.printStackTrace(); 
         } 

        }*/ 
       } 

      }; 

     bOpen.addActionListener(action); 
     //  bDisplay.addActionListener(action); 
     } 

    //returns String name of file 
     static File getFile() throws IOException 
     { 
     return file; 
     } 
    } 

    class ButtonPanel extends JPanel 
    { 
     JButton makeBlue; 
     public static BufferedImage img; 
     public static int width, height; 
     //BufferedImage img; 
     ButtonPanel(BufferedImage x) 
     { 

      img = x; 
      int width, height; 
     setBackground(Color.RED); 
     makeBlue = new JButton("Make Blue"); 
     add(makeBlue); 
     ActionListener action = 
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
         int width, height; 
        if (e.getSource()== makeBlue) 
        { 
          //img = x; 
         width = img.getWidth(); 
          height = img.getHeight(); 
          System.out.println(width + " " + height); 
        repaint(); 

        } 
       } 

      }; 

     makeBlue.addActionListener(action); 
     } 
    } 

L'erreur est quelque part dans la classe panneauBoutons mais je ne suis pas sûr de ce qu'il est. L'erreur que je reçois actuellement lorsque j'appuie sur le bouton makeBlue est la suivante:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at ButtonPanel$1.actionPerformed(ImageEditorDeluxe.java:185) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:708) 
    at java.awt.EventQueue$4.run(EventQueue.java:706) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Toute aide serait appréciée. Je vous remercie.

+0

ImageEditorDeluxe.java:185, qu'est-ce que cette ligne a? – perencia

+0

Vous devez savoir comment observer la trace de la pile d'exceptions et identifier la ligne défaillante. Il est alors relativement simple de remonter de là et de comprendre pourquoi le pointeur est nul. –

+0

Je suis assez nouveau avec Java et c'est un projet ambitieux. Je ne sais pas comment regarder une trace de pile d'exception ou ce que c'est. – masonc15

Répondre

2

Le stacktrace est assez clair:

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

at ButtonPanel$1.actionPerformed(ImageEditorDeluxe.java:185)

Ce qui se résume à cette ligne de code:

width = img.getWidth(); 

dans ce grand morceau de code:

class ButtonPanel extends JPanel 
{ 
    JButton makeBlue; 
    public static BufferedImage img; 
    public static int width, height; 
    //BufferedImage img; 
    ButtonPanel(BufferedImage x) 
    { 

     img = x; 
     int width, height; 
     setBackground(Color.RED); 
     makeBlue = new JButton("Make Blue"); 
     add(makeBlue); 
     ActionListener action = 
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        int width, height; 
        if (e.getSource()== makeBlue) 
        { 
         //img = x; 
         width = img.getWidth(); 
         height = img.getHeight(); 
         System.out.println(width + " " + height); 
         repaint(); 

        } 
       } 

      }; 

     makeBlue.addActionListener(action); 
    } 
} 

On dirait img est null. Utilisez un débogueur pour trouver pourquoi et corrigez-le en conséquence.

+0

J'ai changé le code à ceci: 'JButton makeBlue; \t \t BufferedImage img; panneauBoutons (BufferedImage x) { \t \t \t \t \t \t img = x; \t \t \t largeur, hauteur; ... ' mais maintenant j'obtiens cette erreur:' error: la variable locale width est accédée depuis la classe interne; doit être déclaré final \t width = img.getWidth(); ' – masonc15

+0

@ masonc15 effectuer le débogage nécessaire pour trouver pourquoi votre' img' est 'null'. –

+0

Je ne suis vraiment pas familier avec le débogage et je ne suis pas au courant d'une solution claire à ce problème. Je sais que cela a quelque chose à voir avec la portée. – masonc15