2014-05-18 3 views
-2

현재 Java에서 BufferedImage, JFrame 및 JPanel을 사용하여 이미지 편집기를 개발하려고하지만 파일에서 읽은 BufferedImage와 상호 작용하도록 버튼을 가져 오는 데 문제가 있습니다. 여기 내 코드는 다음과 같습니다.null 포인터 예외를 해결하는 방법

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); 
     } 
    } 

오류는 ButtonPanel 클래스에 있지만 어쨌든 확실하지 않습니다. makeBlue 버튼을 누를 때 현재 나타나는 오류는 다음과 같습니다.

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) 

어떤 도움을 받으실 수 있습니다. 고맙습니다.

+0

ImageEditorDeluxe.java:185, 그 행에는 무엇이 있습니까? – perencia

+0

예외 스택 추적을보고 실패한 행을 식별하는 방법을 알아야합니다. 그렇다면 거기에서 추적하여 포인터가 null 인 이유를 파악하는 것은 상대적으로 간단한 문제입니다. –

+0

나는 자바에 대해 꽤 새로운데, 이것은 야심적인 프로젝트이다. 나는 예외 스택 추적을 보는 방법이나 그것이 무엇인지를 모른다. – masonc15

답변

2

스택 트레이스는 매우 분명하다 :

코드 줄 아래로 비등

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

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

:

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); 
    } 
} 

img 것 같은데 : 코드의 큰 조각

width = img.getWidth(); 

null입니다. 디버거를 사용하여 이유를 찾아 적절히 수정하십시오.

+0

코드를 다음과 같이 변경했습니다 : 'JButton makeBlue; \t \t BufferedImage img; ButtonPanel (않는 BufferedImage X) { \t \t \t \t \t \t IMG = X; \t \t \t int 너비, 높이; ... ' 하지만 이제 오류가 발생합니다 :'오류 : 로컬 변수 width는 내부 클래스에서 액세스됩니다; \t 너비 = img.getWidth(); ' – masonc15

+0

@ masonc15는 왜'img'가'null'인지 찾기 위해 필요한 디버깅을합니다. –

+0

나는 디버깅에 익숙하지 않고이 문제에 대한 명확한 해결책을 모르고있다. 범위와 관련이 있다는 것을 알고 있습니다. – masonc15

관련 문제