2013-03-11 77 views
0

我是新来的swing,并试图编写一个代码,在JFrame上有一个按钮,点击它可以打开一个JFileChooser来选择一个图像,用户选择后,它会显示它thr JFrame,但我一直得到
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
,我发现我不能设置选定的图像图标到JPanel,这让我疯狂,请帮助我!
我的代码是:
无法将imageicon设置为JLabel,始终为空

public class ImageLoading extends JFrame{ 

private static final int FRAME_WIDTH = 500; 
private static final int FRAME_HEIFHT = 500; 
private BufferedImage mImage; 
private JFrame frm; 
private JPanel panel; 
private JButton button; 
String name,name1; 

public class ButtonListener implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     String source=filechoose(); 
     File inputFile = new File(source); 
     System.out.println("File Directory: " + inputFile.toString()); 
     try { 
      mImage = ImageIO.read(inputFile); 
      System.out.println("Buffered Image: " + mImage.toString()); 
     } catch (IOException ex) { 
      System.out.println(ex.getMessage()); 
     } 

      ImageIcon image = new ImageIcon(mImage); 
      System.out.println("Image Icon: " + image.toString() + " ::: " +image.getIconHeight()); 
      JLabel lb = new JLabel(image);// HERE I GET EXCEPTION 
      System.out.println("Image Label: " + lb.toString()); 
      panel.add(lb); 
      panel.revalidate(); 
      panel.repaint(); 
      frm.pack(); 

    } 
} 


public void imageLoading(){ 
    frm = new JFrame("image loading test"); 
    frm.setLayout(null); 
    JLabel label2 = new JLabel("Open a picture"); 
    button = new JButton("Open"); 
    panel = new JPanel(); 
    panel.setBounds(10, 10, 400, 400); 

    panel.add(button); 
    panel.add(label2); 

    ImageLoading load = new ImageLoading(); 
    ButtonListener listener = load.new ButtonListener(); 

    button.addActionListener(listener); 

    frm.add(panel); 

    frm.setSize(FRAME_WIDTH,FRAME_HEIFHT); 
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frm.setVisible(true); 
} 

public String filechoose(){ 
    JFileChooser chooser = new JFileChooser(); 

    chooser.setFileFilter(new javax.swing.filechooser.FileFilter() { 
     public boolean accept(File f) { 
      name = f.getName().toLowerCase(); 
      return name.endsWith(".gif") || name.endsWith(".jpg") 
        || name.endsWith(".jpeg") || f.isDirectory(); 
     } 

     public String getDescription() { 
      return "Image files"; 
     } 
    }); 

    int r = chooser.showOpenDialog(this); 

    if (r == JFileChooser.APPROVE_OPTION) { 
     name1 = chooser.getSelectedFile().getAbsolutePath(); 
     StringBuffer sb=new StringBuffer(); 
     sb.append(name1); 

     int l=sb.length(); 
     for(int i=0;i<l;i++){ 
      if(sb.charAt(i)=='\\'){ 
       sb.insert(i, "\\");     
      } 
     } 
    } 
    return name1; 
} 

public static void main(String a[]){ 

    ImageLoading i = new ImageLoading(); 
    i.imageLoading(); 
} 

` 请帮我这或给我一些样品做这个....谢谢!

+0

愚蠢的问题,但'System.out.println(“Buffered Image:”+ mImage.toString());'打印出来?在上一行中可能会导致mImage为null – 2013-03-11 02:05:09

回答

1

看看这些行:

ImageLoading load = new ImageLoading(); // not needed 
ButtonListener listener = load.new ButtonListener(); 
button.addActionListener(listener); 

您要添加ImageLoading一个ButtonListenerbutton连接到一个新的(不必要的)实例。 panel被实例化在imageLoading方法,但这不是在这个新实例调用导致NullPointerException后来当你尝试调用

panel.add(lb); 

(该stacktraceNPE的根本原因的一个很好的指标)

您可以使用ImageLoading当前实例已经panel实例:

ButtonListener listener = new ButtonListener(); 
+0

非常感谢你!你救我 !!! – Amy 2013-03-11 02:49:49

+0

不客气:) – Reimeus 2013-03-11 04:33:59