image loading using a JFileChooser into a JFrame

imageicon, java, jlabel, jpanel, swing

Solution

The value of `img` will only have a real value after the user click the button and chooses the file to display. Until this time, the value of `img` is `null`, so when it continues through your method and calls the line `ImageIcon icon=new ImageIcon(img);`, it is trying to create an `ImageIcon` object for `null`.

To correct this, you should only be creating the `ImageIcon` when the user has chosen the file. Here is a change that should be closer to working correctly. (see the comments `//ADDED` and `//REMOVED` in the code below to see the changes...

...
class power extends JFrame {
    JFileChooser chooser;
    BufferedImage img;
    JButton button,button2;
    JFrame comp;
    String filename;
    File file ; 
    JLabel label; // ADDED

    public power() {
    ...
            public void actionPerformed(ActionEvent e) {
                if (e.getSource()==button) {
                    chooser.showOpenDialog(null);
                    file = chooser.getSelectedFile();

                    try {
                        img=ImageIO.read(file);
                        ImageIcon icon=new ImageIcon(img); // ADDED
                        label.setIcon(icon); // ADDED

                        Dimension imageSize = new Dimension(icon.getIconWidth(),icon.getIconHeight()); // ADDED
                        label.setPreferredSize(imageSize); // ADDED

                        label.revalidate(); // ADDED
                        label.repaint(); // ADDED
                    }
                    catch(IOException e1) {}
                }

                if (e.getSource()==button2){
                    comp.setVisible(true);
                }
            }
        };

        //ImageIcon icon=new ImageIcon(img); // REMOVED
        //JLabel label=new JLabel(icon); // REMOVED
        label = new JLabel(); // ADDED

        JPanel secpanel=new JPanel();
        ...

To explain what I've changed...

- The `label` will now be created as an empty `JLabel` when you first start the program. It is also stored as a global variable so we can access it later

- When the button is clicked, the `img` is created, as before, and then it is loaded into your `label` using `setIcon();`

- The label is resized, then `revalidate()` and `repaint()` to make sure that the image is drawn after it is set.

Problem

I am trying to write a code that displays an image selected using a JFileChooser into another JFrame .I tried the following code below but only got the following errors. ``` Exception in thread "main" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:228) at power.<init>(fCGUI.java:53) at fCGUI.main(fCGUI.java:11) ``` Here is the code: ``` import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class fCGUI { public static void main(String []args) { power p=new power(); p.setVisible(true); } } class power extends JFrame { JFileChooser chooser; BufferedImage img; JButton button,button2; JFrame comp; String filename; File file ; public power() { setSize(450,450); panel.setLayout(new BorderLayout()); JPanel panel=new JPanel(); getContentPane().add(panel); button =new JButton("press"); panel.add(button,BorderLayout.NORTH); chooser = new JFileChooser(); ActionListener action=new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource()==button) { chooser.showOpenDialog(null); file = chooser.getSelectedFile(); try { img=ImageIO.read(file); } catch(IOException e1) {} } if (e.getSource()==button2) { comp.setVisible(true); } } }; ImageIcon icon=new ImageIcon(img); JLabel label=new JLabel(icon); JPanel secpanel=new JPanel(); comp=new JFrame(); comp.setSize(650,500); comp.setLayout(new BorderLayout()); comp.setTitle("View Report"); JRootPane compPane=comp.getRootPane(); Container contePane=compPane.getContentPane(); contePane.add(secpanel); secpanel.add(label,BorderLayout.CENTER); button2=new JButton("access"); button2.addActionListener(action); button.addActionListener(action); panel.add(button2,BorderLayout.SOUTH); } } ```

Original source