我想创建简单的绘图程序;
这是我的程序的mousePressed和mouseDragged事件:
private void mousePressed(java.awt.event.MouseEvent evt) {
touch = evt.getPoint();
pressed = true;
}
private void mouseDragged(java.awt.event.MouseEvent evt) {
Point p = evt.getPoint();
if(pressed){
graphics2D.drawLine(touch.x, touch.y, p.x, p.y);
}
repaint();
}
但是当我尝试绘制某些内容时,它总是在"Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException"
graphics2D.drawLine(touch.x, touch.y, p.x, p.y);
我还覆盖了paintComponent方法
public void paintComponent(Graphics g){
if(image == null){
image = createImage(getSize().width, getSize().height);
graphics2D = (Graphics2D)image.getGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
g.drawImage(image, 0, 0, null);
}
我明确的方法是:
public void clear(){
graphics2D.setPaint(Color.white);
graphics2D.fillRect(0, 0, getSize().width, getSize().height);
graphics2D.setPaint(Color.black);
repaint();
}
我该怎么办?
由于
答案 0 :(得分:2)
您需要了解如何使用Java绘制内容: Painting in AWT and Swing
如果您使用Swing进行自定义绘制,则应覆盖要为其自定义绘制的组件上的方法paintComponent(Graphics g)
,并在该覆盖方法中进行绘制。您将始终在该方法中获得初始化的Graphics
对象。
答案 1 :(得分:1)
您尚未指定graphics2D
的任何内容。我的猜测是,这是一个你永远不会初始化的字段,所以它总是有一个空值。
您可能实际上应该在某些“要绘制的线”列表中添加一行,然后在绘图处理程序中实际执行绘图部分。当你想做任何绘画时,这就是要处理的事件。
答案 2 :(得分:0)
您发布的代码看起来很合理。您在创建图像时初始化graphics2D变量。
Custom Painting Approaches显示了两种方法。其中一种方法是绘制到BufferedImage,这类似于你要做的事情。比较代码,看看有什么不同。