# paintComponent Methode



## .basti (20. Dez 2021)

Guten Abend,
ich hab eine kurze Frage. Ist es möglich, wenn ich zwei Rechtecke mit der paintComponent Methode zeichnen lasse, nur eines davon repaint-en zu lassen? Wenn ja wie?
LG


----------



## kneitzel (20. Dez 2021)

Du kannst doch in einer Instanzvariable speichern, was gemalt werden soll um dann in der Methode nur das zu malen, was du aktuell malen willst.


----------



## Oneixee5 (21. Dez 2021)

Dazu folgendes kleines Testprogramm. Es soll zeigen, wenn das Rechtecke einmal auf das Graphics-Object gezeichnet wurde, dann bleibt es immer erhalten. Wenn du dein Rechteck also neu Zeichnen willst, mit einer anderen Größe oder Position, dann musst du das bestehende Rechteck zuerst "übermalen". Sonst werden am Ende 2 Rechtecke dargestellt. es funktioniert quasi genau wie auf einem Blatt Papier.
Hast du jetzt 2 Rechtecke (unterschiedliche Farbe, Lienenstärke) gezeichnet und beide überschneiden sich, dann musst du beide Rechtecke löschen und neu zeichnen, wenn eins davon verändert werden soll. In der Zeichnung bleiben ansonsten irgendwelche Fragmente an den Berührungspunken zurück.


```
class TestPaint extends JPanel {

    private int offset = 10;

    public TestPaint() {
        setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(final Graphics g) {
        g.drawRect(this.offset, this.offset,
                getWidth() - 2 * this.offset,
                getHeight() - 2 * this.offset);
    }

    public static void main(final String[] args) throws Exception {
        final JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(300, 300);
        final TestPaint comp = new TestPaint();

        jFrame.add(comp);
        jFrame.setVisible(true);

        for (int i = 10; i < 40; i+=2) {
            Thread.sleep(300);
            comp.offset = i;
            comp.repaint();
        }

    }
}
}
```


----------



## .basti (22. Dez 2021)

Ich glaub ich hab das bisschen falsch formuliert, ich beschreibe es nochmal genauer. Ich programmier ein kleines Spiel einfach um mir die Grundlagen bisschen beizubringen und da hab ich ein Spieler den ich mit w,a,s,d bewegen kann ich ein Rechteck mit zufälligen x,y Koordinaten. Um allerdings den Spieler bewegen zu lassen brauch ich einen Timer und eben repaint. Dieser Timer zeichnet aber dann nicht nur meinen Spieler neu sondern auch alle paar ms mein Hindernis und dann fliegt es im Frame umher. Ich hab beides in einer Klasse zeichnen lassen, weil ich sonst nicht beides gleichzeitig in mein Frame dargestellt bekomme. Wie kann ich also nur meinem Programm sagen, dass nur der Spiel neu gezeichnet werden soll?


----------



## Blender3D (23. Dez 2021)

https://www.java-forum.org/thema/mehrere-klassen-auf-jframe.195656/#post-1289310


----------

