2010-03-10 35 views
0

我正在擴展JPanel來創建自定義繪圖面板,但得到一個NullPointerException並且無法解決原因。我已經刪除了代碼,直到它完全顯示爲止,但錯誤仍然存​​在。從那裏我稱之爲setRenderingHints方法行NullPointerException在自定義JPanel中使用Graphics2D

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

package testdraw; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.JPanel; 

public class DrawPanel extends JPanel { 

    public DrawPanel() { 
     this.Draw(); 
    } 

    public void Draw(){ 
     Graphics g = this.getGraphics(); 
     Graphics2D g2d = (Graphics2D) g; 

     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     rh.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_SPEED); 

     g2d.setRenderingHints(rh); 
    } 
} 

,我發現了錯誤。任何幫助讚賞。

回答

0

你在構造函數中調用「Draw」。在調用getGraphics之前,您應該等到它完全構建並可見。

+0

謝謝,我應該猜到了。 – VirtualMe 2010-03-10 16:20:40

+0

對不起,但它不僅是一個在構造函數中調用繪製的問題。相反,您的繪圖方法不符合Swing框架行爲。查看我的答案瞭解更多詳情。 – Riduidel 2010-03-10 16:30:20

+0

@Riduidel,我說的非常準確。我沒有告訴他*他應該從哪裏調用他的Draw()方法,但是這並不會讓他錯誤地告訴他不要從構造函數中調用它。 – 2010-03-10 17:03:22

2

null當你打電話給Graphics g = this.getGraphics();正如Paul所說,你不應該在構造函數中調用它,因爲面板還不存在。將此代碼放入覆蓋的方法paintComponent()方法

+0

好主意,我會仔細閱讀Javadoc。 – VirtualMe 2010-03-10 16:26:23

+0

+1有關paintComponent()的工作原理的更多信息,請參閱http://java.sun.com/products/jfc/tsc/articles/painting/index.html – trashgod 2010-03-10 17:50:20

0

通常,draw方法不由面板本身調用,而是由Java2D框架調用。因此,它不是一個不帶參數方法的Draw(),而是paint(Graphics g)方法。 在這種情況下,Graphics永遠不會爲null,並且始終是graphics2D(就使用Java2 VM而言)。

+0

對不起,但他稱爲什麼相關他的方法「畫」?只要他在JPanel可見之後調用它,他就可以稱它爲「FooBarBlatz」。 – 2010-03-10 17:07:02

+0

是的,但是,在這種情況下,將Draw方法與Paint分離將不僅沒有用,而且還會出現錯誤(在我看來)。 – Riduidel 2010-03-11 09:03:30

相關問題