清除绘图表面时,Java Paint Application会修复NullPointer

时间:2015-10-14 08:50:10

标签: java graphics2d awt-eventqueue

我的问题如下:我试图在java中创建一个绘图应用程序。我收到此错误代码:

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

当我清理绘图表面时。

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

非常感谢你! 此致,斯坦利。

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

1 个答案:

答案 0 :(得分:0)

如果在clear()之前调用paintComponent(),则不会初始化变量g2。

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

另一种选择是插入

if (g2 == null) return;

作为clear的第一行。

这似乎是一种双缓冲实现。我确信Google会帮助您找到替代实施的良好示例,而不会出现此问题。