ich habe ein kleines Problem mit dem Graphics Sachen. Es geht um einen Risiko-Klon. Ich benutze zwei direkt übereinander liegende Panels zum zeichnen. Das hintere zeichnet nur die Landkarte. Das Vordere zeichnet informationen zu den Ländern und beim anklicken eines Landes animierte Pfeile zu den Nachbarländern. Abgesehen davon muss der Rest aber durchsichtig bleiben. Wenn die Pfeilanimation jetzt läuft, sieht man die ganze Zeit über die zwischendurch gezeichneten Bilder (ganz viele Pfeilspitzen) erst wenn die animation beendet ist verschwinden diese. Ich habe schon mehrfach versucht irgendwie das Bild zu leeren aber alles was ich erreiche ist das gesamte füllen mit einer Farbe wie es clear() macht. Ich hab schon versucht die Farbe auf Null zu setzen und einen Alpha wert von 0 anzugeben aber nichts hat geklappt. Kennt einer von euch ne möglichkeit wie ich das Bild wieder komplett leer bekomme?
_________________ Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. Also ungefähr so:
Java Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class Zeichenflaeche extends Component {
private boolean clear = false;
public void clearAll() {
this.clear = true;
this.repain();
}
public void draw() {
this.clear = false;
}
public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Java Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class Zeichenflaeche extends Component {
private boolean clear = false;
public void clearAll() {
this.clear = true;
this.repain();
}
public void draw() {
this.clear = false;
}
public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Java Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class Zeichenflaeche extends Component {
private boolean clear = false;
public void clearAll() {
this.clear = true;
this.repain();
}
public void draw() {
this.clear = false;
}
public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Mir erscheint der Ansatz insgesamt fragwürdig. Würde man sowas normalerweise nicht mit Double-Buffering lösen, indem man pro Frame zunächst den Hintergrund und dann die einzelnen Elemente darauf zeichnet?
Ich arbeite derzeit auch an einem kleinen Framework, das davon Gebrauch macht.
Edit:
Michamab schrieb:
Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. [...]
Das funktioniert IMHO nicht, weil die alten Bildbereiche dabei nicht überschrieben werden.
Zuletzt bearbeitet von Dasd am 09:17:51 12.02.2010, insgesamt 1-mal bearbeitet
@Dasd:
Ich sollte vielleicht noch dazu sagen das ich ein JPanel benutze kein awt.Panel und das auf doubleBuffered = true gesetzt habe.
Am Anfang hab ich alles in ein Panel gezeichnet. Das Problem daran war, dass das Hintergrundbild an 2000 X 2000 Pixel groß ist, wenn ich das mitzeichne schaff ichs auf meinem schon recht alten Notebook grade mal auf 2-3 Bilder in der 2 Sekunden Animation. Deswegen versuch ich das ja auszulagern.
_________________ Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
Niemals paint() überschreiben! Immer paintComponent()
Das stimmt im Fall von JComponent zwar, paintComponent() existiert in der Klasse Component allerdings nicht.
Dasd schrieb:
Edit:
Michamab schrieb:
Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. [...]
Das funktioniert IMHO nicht, weil die alten Bildbereiche dabei nicht überschrieben werden.
Das funktioniert sehr wohl, weil ja durch den Aufruf von repaint() wieder paint() aufgerufen wird und alles komplett neu gezeichnet wird.
Da ich ein JPanel habe hätte ich paintComponent überschreiben können und ich weis auch dass man das so macht. Da das Jpanel aber eh nichts anderes tut als zeichnen und vorallem niemals irgendwelche Components beinhalten wird, wars mir schlicht und einfach egal.
@Michamab:
Das wird nicht funktionieren da ich nur kleine Bereiche des Bildes zeichne und nicht das ganze, da der Rest ja durchsichtig bleiben muss.
@DEvent:
Ich wollte hier eigentlich nur auf Java-Bordmittel zurückgreifen aber ich werd mir das mal ansehen. Danke.
_________________ Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.