2016-04-28 5 views
-1

graphics2D gibt "NULL" immer in unterem Code zurück. Aus diesem Grund wird die Methode putPixel() nicht aufgerufen. Ich rufe PictureBox von Formularentwurf auf.Graphics2D liefert "NULL" immer

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 Methode wird von der Haupt genannt, wo ich (x, y) in Point2D Array gespeichert koordinieren.

+2

Warum nennen Sie 'repaint' in' paintComponent'? –

+1

Wo sind 'image',' graphics2D' und 'imageSize' definiert? –

+1

Sie haben repaint() in clear und paintComponent Methoden aufgerufen, das ist falsch. Als Repaint selbst wird paintComponent – Blip

Antwort

3

Da Sie putPixel von außerhalb der Klasse aufgerufen haben und Sie die graphics2D und image im Konstruktor, dass es möglicherweise nicht initialisiert haben, wenn Sie alle putPixel Methode der Klasse aufrufen möglicherweise nicht angezeigt wurden. Sie erhalten also graphics2D als null, da es nur initialisiert wird, wenn paintComponent aufgerufen wird, und es aufgerufen wird, wenn diese Klasse angezeigt wird.

Die Lösung könnte sein, dass Sie den Initialisierungscode für die image und graphics2D an den Konstruktor verschieben, so dass Sie nicht null Sie stoßen während putPixel aufrufen.

HINWEIS

Sie wahllos die Methode repaint() genannt haben. Sie sollten daran denken, dass repaint() Aufrufe paint() Methode, die wiederum ruft paintComponent() Methode. Also, wenn Sie repaint() innerhalb paintComponent() Methode aufrufen, laufen Sie Gefahr, eine Endlosschleife zu erstellen. Hier haben Sie es einmal in paintComponent und nochmals in clear Methode aufgerufen, die von paintComponent aufgerufen wird.

+0

Danke, es hat geholfen. –