![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Neuer Benutzer
Registriert seit: 04.10.2005
Beiträge: 20
|
Hallo.
Ich habe nun für die Shapes einen anderen Denkansatz. Ich will folgendes machen: Ich habe ein Applet mit einem Panel. Es wird ein Thread gestartet der immer wieder repaint auf dieses panel aufruft, das klappt auch. Ziel ist es (am Anfang) einfach 2 Hosts zu zeichnen. Die sind im Moment nicht mehr als ein Viereck und ein Text. Diese Host haben eine eigene Klasse und eine Methode "drawHost" mit dem Übergabeparameter "Graphics2D g2D". Dieses "g2D" wird in der paint erstellt. In der drawHost methode werden dann in das g2D das Viereck und der Text gemalt. Das Dumme ist nur: das geht nicht. Hier ein bisschen Code: Code:
public void paint(Graphics g)
{
if (!this.start)
{
//Wird Paint das erste mal aufgerufen (!this.start) wird das Graphics2D Objekt erstellt
//und Alice und Bob ...
this.g2D = (Graphics2D) g; //wird als membervariable gespeichert
this.Alice = new Host(50, 200, "Alice", Color.ORANGE);
this.Bob = new Host(700, 200, "Bob", Color.ORANGE);
//Thread starten
Runnable PaintIt = new PaintThread(this);
Thread t = new Thread(PaintIt);
t.start();
this.start = true;
}
else
{
System.out.println("PAINT!"); //das wird ausgegeben, der Thread ruft paint echt auf!
//alice und bob malen ...
this.Alice.drawHost(1, this.g2D);
this.Bob.drawHost(1, this.g2D);
this.drawConnection(g2D);
}
}
public void drawHost(int state, Graphics2D g2D) //Host zeichnen (das ist in der klasse host)
{
switch (state)
{
case 1:
// wenn das applet noch im status 1 ist (anfang) einfach den Host malen
g2D.setColor(this.color);
g2D.fillRect(this.x, this.y, 50, 50);
g2D.setColor(Color.black);
g2D.drawString(this.name, (this.x + 13), (this.y + 27));
break;
}
}
Brauche Hilfe und vielen Dank für eure Zeit! Grüße, Venom |
|
|
|
|
|
Nach oben #2 |
|
Benutzer
Registriert seit: 15.11.2005
Beiträge: 75
|
Problem 1:
Code:
//Thread starten Runnable PaintIt = new PaintThread(this); Thread t = new Thread(PaintIt); t.start(); this.start = true; (Das ist hier nicht die eigentliche Fehlerursache, aber im Fall von Multithreading schadet eine leicht Paranoia nie) Problem 2: paint() wird immer mit einem neuen Graphics-Object aufgerufen. Das kannst Du verifizieren, indem Du z.B. ganz oben in der paint()-Methode eine Ausgabe einbaust: Code:
System.out.println( "g# :" + g.hashCode()); Da das eigentliche Zeichnen jetzt aber erst aus weiteren paint()-Aufrufen heraus erfolgt, bei denen jeweils neue Graphics-Objekte rezeugt werden, wird dem drawHost() das alte (ungültige) Graphics-Objekt mitgegeben. Lösung: z.B. im paint () auch im else-Zweig (oder nur einaml vor der if-Anweisung) this.g2D zuweisen, so dass jedesmal das aktuelle gültige Graphics-Objekt verwendet wird. |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Graph zeichnen, Bézierkurve, SVG | $traight-$hoota | Sonstige Programmiersprachen | 3 | 05.11.2006 12:32 |
| Programm zum zeichnen von Swing GUIs | punkmuckel | Desktop-Applikationen und Grafik | 1 | 09.12.2005 13:09 |
| Größen ermitteln beim zeichnen von Komponenten | Robinson | Desktop-Applikationen und Grafik | 5 | 22.11.2005 22:46 |
| Shapes zeichnen | Venom | Desktop-Applikationen und Grafik | 0 | 16.11.2005 10:24 |
| Auf ein Canvas Objekt per Mouseevents Linien Zeichnen | schärple | Desktop-Applikationen und Grafik | 6 | 12.06.2004 17:42 |