2013-04-27 1 views
0

J'ai la classe DrawOutput, qui étend JComponent. this.getGraphics que je passe à peindre est nul ici. Comment puis-je obtenir des Grapics de cette classe?exception de pointeur null dans les graphiques du composant

public class DrawOutput extends JComponent { 

Voici le constructeur de classe.

DrawOutput (MinDistances requiredMinDistances, MainMatrix matrix){ 
      super(); 
      getRequiredMedoidsArray(requiredMinDistances); 
      paint(this.getGraphics(), requiredMinDistances, matrix); 
     } 
contenu

est nul ici

public void paint(Graphics content, MinDistances requiredMinDistances, MainMatrix matrix)  { 
    ... 

} 

private float[] setColor (int colorID){ 
      float[]hsbValues=new float[3]; 
    if(colorID == 1){ 
     hsbValues = Color.RGBtoHSB(0,255,255,hsbValues); 
    } 
    else if(colorID == 2){ 
     hsbValues = Color.RGBtoHSB(255,0,255,hsbValues); 
    } 
    else if(colorID == 3){ 
     hsbValues = Color.RGBtoHSB(0,255,0,hsbValues); 
    } 
    else if(colorID == 4){ 
     hsbValues = Color.RGBtoHSB(255,255,0,hsbValues); 
    } 
    else if(colorID == 5){ 
     hsbValues = Color.RGBtoHSB(255,0,0,hsbValues); 
    } 
    else if(colorID == 6){ 
     hsbValues = Color.RGBtoHSB(255,255,255,hsbValues); 
    } 
    else{ 
     hsbValues = Color.RGBtoHSB(0, 0, 0,hsbValues); 
    } 
    return hsbValues; 
} 

private void getRequiredMedoidsArray(MinDistances distancesCell){ 
    ... 
} 

} 

Toutes les suggestions?

+1

peut-être vous devriez remplacer 'paint()' et attendre jusqu'à ce qu'il soit appelé automatiquement? – micha

+0

"Les programmes Swing doivent surcharger' paintComponent() 'au lieu de surcharger' paint() '." - [* Peinture dans AWT et Swing: The Paint Methods *] (http://www.oracle.com/technetwork/java/ paint-140037.html # callbacks). – trashgod

Répondre

0

Ne le faites pas dans le constructeur, gardez le peinage dans la peinture, ou faites la peinture en utilisant un rendu actif.

Ma suggestion est

  1. Créer une BufferedImage dans le constructeur. Dessinez sur l'image tamponnée quand vous le voulez.
  2. Dessinez le BufferedImage à l'écran dans la peinture.

état global:

BufferedImage offscreen; 
Graphics offscreenGraphics; 

dans le constructeur:

offscreen = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
offscreenGraphics = offscreen.getGraphics(); 

alors vous pouvez juste tirer sur offscreenGraphics chaque fois que vous voulez sans problème.

Puis dans la peinture:

g.drawImage(offscreen, 0, 0, width, height, null); 

Hope this helps.