eigene paintComponent(Graphics) kommt mit rezise nicht klar

Status
Nicht offen für weitere Antworten.

hupfdule

Top Contributor
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:
Code:
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?
 
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.
 
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.

Code:
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);
    }    
}
 
Kein Wunder das es seltsam aussieht. Du fügst dem Polygon mehr und mehr Punkte hinzu.
Entweder neu erstellen, oder reset() aufrufen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben