2016-04-28 124 views
-1

graphics2D始終在下面的代碼中返回「NULL」。由於putPixel()方法沒有被調用。我從表單設計調用PictureBox。Graphics2D始終返回「NULL」

public class PictureBox extends JPanel { 

Graphics2D graphics2D; 
static BufferedImage image; 
int imageSize = 300; 

public PictureBox(){ 
    setDoubleBuffered(false); 
    this.setBorder(UIManager.getBorder("ComboBox.border")); 
    this.repaint();  
} 

public void paintComponent(Graphics g){ 

    super.paintComponent(g); 
     if(image == null){ 
      image = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_RGB); 
      graphics2D = (Graphics2D)image.createGraphics(); 
      graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      clear(); 
     } 
      Graphics2D g2D = (Graphics2D) g; 
      g2D.drawImage(image, 0, 0, this); 
    repaint(); 
} 

public final void putPixel(int x, int y, Color color) { 
    if(graphics2D != null){ 
    graphics2D.setColor(color); 
    graphics2D.drawLine(x, y, x, y); 
    repaint(); 
    } 
} 
public void clear() { 
    graphics2D.setPaint(Color.WHITE); 
    graphics2D.fillRect(0, 0, imageSize,imageSize); 
    repaint(); 
} 

}

的putpixel方法正在從主叫其中i具有(X,Y)座標存儲在陣列的Point2D。

+2

爲什麼在'paintComponent'中調用'repaint'? –

+1

「image」,「graphics2D」和「imageSize」在哪裏定義? –

+1

你已經在clear和paintComponent方法中調用了repaint(),這是錯誤的。由於重繪本身會調用paintComponent – Blip

回答

3

既然你叫從類的外部putPixel和你沒有初始化的graphics2Dimage在構造函數中它可能是,當你調用的所有方法putPixel可能尚未顯示的類。所以你得到graphics2Dnull,因爲它只在調用paintComponent時初始化,並且在顯示此類時調用它。

的解決方案可能是您的imagegraphics2D的初始化代碼移到構造函數,這樣你就不會遇到null同時呼籲putPixel

注意

你胡亂調用的方法repaint()。您應該記住,repaint()調用paint()方法,然後調用paintComponent()方法。因此,如果您在paintComponent()方法內調用repaint(),則會遇到創建無限循環的風險。在這裏,你已經在paintComponent中調用了兩次,並且再次調用了方法,該方法由paintComponent調用。

+0

感謝它幫助。 –