# Threads in einen Frame zeichnen lassen (Paint()?!)



## Syntix (9. Nov 2009)

Heyho,
folgendes Problem stellt sich mir:

Ich bin dabei eine Application zu schreiben bei der beispielsweise Kreise von oben nach unten fallen sollen. Diese Kreise sollen von Threads gezeichnet und animiert werden via repaint(); (Ich hoffe das stimmt schonmal so).

Mein Problem ist das ich es einfach nicht hinbekomme bzw. wahrscheinlich nicht verstehe wie ich aus einem Thread herraus in einen Frame zeichnen lassen kann. Das alles soll natürlich "gleichzeitig" ablaufen, sprich alle Kreise gleichzeitig fallen deshalb entfällt meines Wissens nach auch schonmal das aufrufen jedes einzelnen paint(); der Threads.

Beispiel:

Es existiert das "Hauptfenster" MyFrame und 3 Threads von PaintSth und jeder dieser Threads soll einen Kreis im HauptFenster animieren.

Danke schonmal =)

MfG


----------



## javimka (9. Nov 2009)

Der einzige Thread, der irgendetwas zeichnen sollte, ist der Event-Dispatching-Thread (EDT). Ein anderer Thread könnte z.B. Mittelpunkt oder Radius des Kreises ändern und dann repaint aufrufen, so dass der EDT den Kreis dann neu zeichnet.

Der einzige Weg, der mir einfällt um die Arbeit des Zeichnens auf mehrere Threads auszuweiten wäre, dass repaint (ausgeführt vom EDT) neue Threads startet und diese auf dem Graphics Objekt g zeichnen lässt. Der EDT müsste dann warten bis all die Threads fertig und beendet sind und kann dann weiter machen.

Was auch immer du machst, vermeide es, durch getGraphics das Graphics Objekt einer Komponente zu bekommen und darauf zu zeichnen. Das endet nie gut.


----------



## Michael... (9. Nov 2009)

Folgendes Tutorial kennst Du hoffentlich bereits bzw. Dir ist das Zeichnen in Swing geläufig.
http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html#post272072

1. Zeichne auf ein JPanel und nicht direkt auf den JFrame
2. Ich würde einen Thread nehmen um alle Kreise zu manipulieren (Wenn's unbedingt sein muss geht's auch mit mehreren Threads).
3. die Kreise in der paintComponent() des JPanel zeichnen lassen - vorher super.paintC... aufrufen
4. der Threads muss das JPanel kennen, um dessen repaint() aufzurufen, er muss auch die Kreise kennen, um deren Position zu ändern


----------



## nw90 (9. Nov 2009)

Du musst zunächst einmal die paint() Methode überschreiben:

```
public void paint(Graphics g)
    {
        //die "normale" paint-Methode aufrufen
        super.paint(g);
        
        g.drawImage(Kreis1, Kreis1_x, Kreis1_y, this);
        g.drawImage(Kreis2, Kreis2_x, Kreis2_y, this);
        g.drawImage(Kreis3, Kreis3_x, Kreis3_y, this);
    }
```
wobei Kreis1-3 jeweils ein Image-Objekt ist. In deinen Threads müsstest du nun jeweils nur die Variablen für die Image-Objekte ändern und die repaint()-Methode aufrufen


```
public void run()
{
     Kreis1_y += 10;
     MyFrame.repaint();
}
```


----------



## javimka (9. Nov 2009)

Iich würde eher paintComponent überschreiben. Dann kann man dem Panel immer noch Borders geben und Komponenten hinzufügen.


----------



## KrokoDiehl (9. Nov 2009)

Jupp, 
	
	
	
	





```
paintComponent()
```
 sollte man überschreiben (s. Tutorial-Link von _Michael..._).


----------

