我的问题如下:我试图在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();
}
}
答案 0 :(得分:0)
如果在clear()
之前调用paintComponent()
,则不会初始化变量g2。
您可以在构造函数中初始化您的g2实例,但我不确定这是否适合您,因为您需要窗口的大小。
另一种选择是插入
if (g2 == null) return;
作为clear
的第一行。
这似乎是一种双缓冲实现。我确信Google会帮助您找到替代实施的良好示例,而不会出现此问题。