2015-10-14 55 views
0

我的问题如下:我试图在java中创建一个绘画应用程序。我得到这个错误代码:Java Paint应用程序清除绘图表面时的thorws NullPointer

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at areacalc.DrawArea.clear(Form.java:67) 
    at areacalc.DrawArea.mouseMoved(Form.java:115) 

当我清理绘图表面。

这是我的代码,你能帮我避免空指针吗?我应该在哪里放置事件处理程序以避免获得空指针?

非常感谢! 斯坦利问候。

package areacalc;

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 

class DrawArea extends JComponent implements MouseListener, MouseMotionListener 
{ 
    private Image image; 
    private Graphics2D g2;   
    private int currentX, currentY, oldX, oldY, X, Y; 
    private ArrayList<Integer[]> points = new ArrayList<Integer[]>(); 
    private boolean stopped = false; 
    public boolean crtl_pressed = false; 

    public DrawArea() 
    { 
     setDoubleBuffered(false);  
     initEventHandlers(); 
    } 

    public void initEventHandlers() 
    { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    public double length(int x1, int x2) 
    { 
     return Math.abs(x1-x2); 
    } 

    protected void paintComponent(Graphics g) 
    { 
     //System.out.println("paintComponent"); 

     if (image == null) 
     { 
      image = createImage(getSize().width, getSize().height); 
      g2 = (Graphics2D) image.getGraphics(); 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      clear();    
     } 

     g.drawImage(image, 0, 0, null); 
    } 

    public void clear() 
    { 
     g2.setPaint(Color.black); 
     g2.fillRect(0, 0, getSize().width, getSize().height); 
     repaint(); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) 
    {  
    if(e.getButton() == MouseEvent.BUTTON1&&(!stopped)) 
     { 
      oldX = e.getX(); 
      oldY = e.getY(); 

      if((currentX!=oldX)&&(currentY!=oldY)&&(currentX!=0)&&(currentY!=0)) 
      { 
       g2.setPaint(Color.green); 
       Integer i[] = { currentX, currentY, e.getX(), e.getY() }; 
       points.add(i); 
       g2.drawLine(currentX, currentY, e.getX(), e.getY()); 
       repaint(); 
      } 
     } 
     else if(e.getButton() == MouseEvent.BUTTON3&&points.size()>0)   
     { 
      g2.setPaint(Color.green); 
      g2.drawLine(currentX, currentY, e.getX(), e.getY()); 

      if(points.size()>0) 
       { 
        Integer i[] = points.get(0); 
        g2.drawLine(e.getX(), e.getY(), i[0], i[1]); 
       } 

      repaint(); 
      stopped = true; 
     } 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) 
    { 
     if((!stopped)) 
     {    
      //label.setText(e.getX() + ";" + e.getY()); 

      currentX = oldX; 
      currentY = oldY; 

      clear();  

      for(int j = 0; j < points.size(); j++) 
      { 
       g2.setPaint(Color.green); 
       Integer i[] = points.get(j); 
       g2.drawLine(i[0], i[1], i[2], i[3]); 
       repaint(); 
      } 

      if((currentX!=0)&&(currentY!=0)) 
      { 
       g2.setPaint(Color.yellow); 

       if(!crtl_pressed) 
       { 
        if(points.size()>0) 
        { 
         Integer i[] = points.get(0); 
         g2.drawLine(e.getX(), e.getY(), i[0], i[1]); 
        } 

        g2.drawLine(currentX, currentY, e.getX(), e.getY()); 
       }      
       else 
       { 
        if(length(currentX, e.getX())>=length(currentY, e.getY())) 
        { 
         if(points.size()>0) 
         { 
          Integer i[] = points.get(0); 
          g2.drawLine(e.getX(), currentY, i[0], i[1]); 

         } 

         g2.drawLine(currentX, currentY, e.getX(), currentY); 
        } 
        else 
        { 
         if(points.size()>0) 
         { 
          Integer i[] = points.get(0); 
          g2.drawLine(currentX, e.getY(), i[0], i[1]); 
         }       

         g2.drawLine(currentX, currentY, currentX, e.getY()); 
        } 
       }      

       repaint(); 
      } 
     } 
    } 

    public void mouseDragged(MouseEvent e){} 
    public void mouseEntered(MouseEvent e){} 
    public void mouseExited(MouseEvent e){} 
    public void mouseClicked(MouseEvent e){} 
    public void mouseReleased(MouseEvent e){} 
} 

public class Form extends JFrame implements ActionListener 
{ 

    public Form() 
    { 
     initUI(); 
    } 

    private void initUI() 
    {  
     setTitle("Area Calculator"); 
     setSize(600, 600); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 

     Container content = getContentPane(); 
     content.setLayout(new BorderLayout()); 
     DrawArea drawArea = new DrawArea(); 
     content.add(drawArea, BorderLayout.CENTER); 

     addKeyListener(
      new KeyAdapter() 
      { 
       public void keyPressed(KeyEvent e) 
       { 
        if(e.getKeyCode() == KeyEvent.VK_CONTROL); 
         //drawArea.crtl_pressed = true; 
       } 

       public void keyReleased(KeyEvent e) 
       { 
        if(e.getKeyCode() == KeyEvent.VK_CONTROL); 
         //drawArea.crtl_pressed = false; 
       } 
     }); 
    } 

    private void doDrawing(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 

     g2d.setPaint(Color.blue); 

     g2d.drawLine(20, 20, 500, 500); 
    } 

    public void paintComponent(Graphics g) 
    { 
     paintComponent(g); 
     doDrawing(g); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     repaint(); 
    } 
} 

回答

0

如果clear()paintComponent()之前调用,变量G2未初始化。

您可以在构造函数中初始化您的g2实例,但我不确定这是否适合您,因为您需要窗口的大小。

另一种选择是插入

if (g2 == null) return; 

作为clear第一行。

看来,这是一种双缓冲实现。我相信谷歌会帮助您找到替代实施的好例子,而不会出现这个问题。

+0

非常感谢!回报解决了问题。 :) –