2011-10-13 71 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,這與您要綁定的內容相似。比較代碼,看看有什麼不同。