Antwort
 
Themen-Optionen Thema durchsuchen
Alt 17.11.2005, 18:20 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 04.10.2005
Beiträge: 20
Standard Shapes zeichnen 2

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;
	}
}
Aber er zeichnet mir nichts.
Brauche Hilfe und vielen Dank für eure Zeit!

Grüße, Venom
Venom ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.11.2005, 09:57 Nach oben    #2
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Problem 1:
Code:
	 //Thread starten
	 Runnable PaintIt = new PaintThread(this);
	 Thread t = new Thread(PaintIt);
	 t.start();
	 this.start = true;
Das kann (muss aber nicht) dazu führen, dass mehrere Painter-Threads gebaut werden: sobald t.start aufgerufen wurde, kann bereits die run-Methode des Runnables aufgerufen werden (also bereits bevor this.start auf true gesetzt wurde). Wenn dann das repaint() kommt, kann es also u.U. passieren, dass paint() mochmal aufgerufen wird, obwohl this.start noch false ist.

(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());
Das Problem besteht darin, dass Du Dir beim ersten paint() das zu diesem Zeitpunkt gültige Objekt merkst. Wenn Du bereits hier drawHost() aufrufen würdest, dann würden die Hosts gezeichnet werden.

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.
Murray ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.11.2005, 16:46 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 04.10.2005
Beiträge: 20
Standard

Super, so inetwa habe ich das nun eh. Danke schön!
Venom ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ä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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45