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.
ImageEditorDeluxe.java:185, qu'est-ce que cette ligne a? – perencia
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. –
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