# eigene paintComponent(Graphics) kommt mit rezise nicht klar



## hupfdule (30. Sep 2007)

Hi,

ich habe eine Komponente, die einen Pfeil zeichnen soll. Dieser Pfeil soll die Komponente immer in voller Höhe ausfüllen. Das Zeichnen selbst klappt auch wunderbar, wenn die Komponente jedoch vergrößert wird, dann überlagt sich das neu gezeichnete Bild immer mit den vorher gezeichneten. Siehe  Screenshot. Der linke Teil zeigt den Pfeil nach dem ersten Zeichnen, der rechte nach einer Vergrößerung.

Folgender Code wird zum Zeichnen benutzt:

```
private static final int PFEIL_DICKE= 2; 
    private static final int SPITZEN_HOEHE= 12;
    private static final int SPITZEN_BREITE= 10;
    private static final Stroke STROKE_DICK= new BasicStroke(PFEIL_DICKE);
    private static final Stroke STROKE= new BasicStroke();

    private final Polygon pfeilspitze= new Polygon();
    
    @Override
    public void paintComponent(final Graphics g) {
        final Graphics2D g2= (Graphics2D) g;
        final Rectangle bounds= this.getBounds();
        final int x= (int) bounds.getX();
        final int y= (int) bounds.getY();
        final int w= (int) bounds.getWidth();
        final int h= (int) bounds.getHeight();
                        
        pfeilspitze.addPoint(y/2, h);
        pfeilspitze.addPoint(y/2 - SPITZEN_BREITE/2, h-SPITZEN_HOEHE);
        pfeilspitze.addPoint(y/2 + SPITZEN_BREITE/2, h-SPITZEN_HOEHE);
        
        //g2.clearRect(x, y, w, h);
        g2.setPaint(this.getBackground());
        System.err.println(this.getBackground());
        g2.fillRect(x, y, w, h);
        g2.setPaint(Color.BLACK);
        g2.setStroke(STROKE_DICK);
        
        g2.drawLine(y/2, 0, y/2, h-SPITZEN_HOEHE);
        g2.setStroke(STROKE);
        g2.fillPolygon(pfeilspitze);
    }
```

Weder das g2.clearRect(), noch das g2.fillRect() ändern etwas an dem Problem. Irgendwelche Ideen?


----------



## Wildcard (30. Sep 2007)

mach super.paintComponent(g) als ersten Aufruf der Methode.


----------



## hupfdule (30. Sep 2007)

Das hatte ich auch schon. Ändert nichts an dem Verhalten.


----------



## Wildcard (30. Sep 2007)

super.paintComponent löscht den Hintergrund. Wenn es bei dir nicht funktioniert, dann hast du wo anders ein Problem.
Um dem auf den Grund zu gehen, poste ein kompilierfähiges Beispiel das dein Problem demonstriert.


----------



## hupfdule (30. Sep 2007)

Wildcard hat gesagt.:
			
		

> super.paintComponent löscht den Hintergrund. Wenn es bei dir nicht funktioniert, dann hast du wo anders ein Problem.


Davon bin ich ausgegangen.


> Um dem auf den Grund zu gehen, poste ein kompilierfähiges Beispiel das dein Problem demonstriert.


Ist zwar nicht exakt dasselbe (der Pfeil wird nur zur Hälfte sichtbar (und ich weiß nicht wieso...), das Problem ist jedoch auch dort zu erkennen.) Einfach das Fenster etwas vergrößern und das Problem wird sichtbar.


```
import java.awt.*;
import javax.swing.*;

public class PfeilTest extends JFrame{
    public PfeilTest(){
        this.setLayout(new GridLayout());
        this.add(new PfeilImage());
    }
    public static void main(String[] args){
        final PfeilTest pf= new PfeilTest();
        pf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pf.setSize(50, 100);
        pf.setVisible(true);
    }
}   

class PfeilImage extends JComponent {
    
    private static final int PFEIL_DICKE= 2; 
    private static final int SPITZEN_HOEHE= 12;
    private static final int SPITZEN_BREITE= 10;
    private static final Stroke STROKE_DICK= new BasicStroke(PFEIL_DICKE);
    private static final Stroke STROKE= new BasicStroke();

    private final Polygon pfeilspitze= new Polygon();
   
    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        final Graphics2D g2= (Graphics2D) g;
        final Rectangle bounds= this.getBounds();
        final int x= (int) bounds.getX();
        final int y= (int) bounds.getY();
        final int w= (int) bounds.getWidth();
        final int h= (int) bounds.getHeight();
                        
        pfeilspitze.addPoint(y/2, h);
        pfeilspitze.addPoint(y/2 - SPITZEN_BREITE/2, h-SPITZEN_HOEHE);
        pfeilspitze.addPoint(y/2 + SPITZEN_BREITE/2, h-SPITZEN_HOEHE);
        
        //g2.clearRect(x, y, w, h);
        g2.setPaint(this.getBackground());
        System.err.println(this.getBackground());
        g2.fillRect(x, y, w, h);
        g2.setPaint(Color.BLACK);
        g2.setStroke(STROKE_DICK);
        
        g2.drawLine(y/2, 0, y/2, h-SPITZEN_HOEHE);
        g2.setStroke(STROKE);
        g2.fillPolygon(pfeilspitze);
    }    
}
```


----------



## Wildcard (30. Sep 2007)

Kein Wunder das es seltsam aussieht. Du fügst dem Polygon mehr und mehr Punkte hinzu.
Entweder neu erstellen, oder reset() aufrufen.


----------



## hupfdule (30. Sep 2007)

Argh! Ich Depp. Ich wusste doch, dass es etwas derart simples ist. Danke dir!


----------

