2011-10-13 42 views
0

我想创建简单的绘图程序;Graphics2D对象总是给NullPointerException

我在这里我的程序的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);

我也overrided方法的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(); 
} 

我该怎么办?

感谢

回答

2

您需要在阅读了如何在Java中吸取的东西:如果您使用的Swing做风俗画 Painting in AWT and Swing

,你应该覆盖的方法paintComponent(Graphics g)您要自定义做组件绘画并在该覆盖方法内进行绘画。您将始终使用该方法获得初始化的Graphics对象。

+0

我也重写了paintComponent(Graphics g)方法 – CanCeylan

+0

@CanCeylan:你不能在mouseDragged(...)方法中绘制你的行。这是行不通的。存储您从MouseEvent获得的点并在paintComponent(...)中执行线条绘制。 –

+0

但我的出发点是这个链接:http://forum.codecall.net/java-tutorials/31180-java-mini-paint-program.html。在该链接中,我可以在mouseDragged方法中绘制线条。我想在我的GUI中应用此架构 – CanCeylan

1

您还没有指定任何关于graphics2D。我的猜测是这是一个你永远不会初始化的字段,所以它总是会有一个空值。

您应该实际上应该在“绘制线条”的某个列表中添加一行,然后在绘制处理程序中实际执行绘图部分。当你想做任何绘画时,这是一个需要处理的事件。

+0

我应该在哪个值初始化graphics2D?我只写了\t Graphics2D graphics2D; – CanCeylan

+0

@CanCeylan:对,所以这是一个实例变量,它确实具有空默认值。如果您处理绘画事件,则应该为您提供图形以在该方法中绘制*作为参数。 –

0

您发布的代码看起来很合理。您在创建图像时初始化graphics2D变量。

Custom Painting Approaches显示了两种方法来做到这一点。其中一种方法是绘制到一个BufferedImage,这与您要绑定的内容相似。比较代码,看看有什么不同。