JComponent ein- und ausfaden

zerix

Hausmeister
Moderator
Wenn du die Komponente neu zeichnest und du verhindest, dass die Children gezeichnet werden, hast du den Effekt den du möchtest. Dazu musst du den bereich nicht "clearn".
Dazu könntest du die Methode paintChildren überschreiben.
Was genau hast du denn vor?

Gruß

Sascha
 

mjkraus

Mitglied
Für die größeren Fades könnte ich da folgendes machen: Das ganze würde ich auf ein BufferedImage zeichnen, die enthaltenen Components entfernen und in einer Variablen zwischenparken, das Graphics-Objekt durch das des BufferedImages ersetzen (da stellt sich die Frage wie kann ich das Ersetzen bewerkstelligen?) und dann die Komponente ausfaden (Für einfaden das ganze dann umgekert). Ist das so überhaupt realistisch?

Bei der Ersetzung des Graphics-Objekt der Komponente mit dem des BufferedImages hätte ich zuerst das Graphics-Objekt geleert (was ja leider nicht so funktioniert wie es soll) und dann das Image mit der aktuellen Transparenz des Fading-Prozesses gezeichnet.

Wie kann ich dann statt die Childrens zu entfernen die von Dir angesprochene paintChildren()-Methode verwenden?
 

zerix

Hausmeister
Moderator
Die paintChildren-Methode ist wie der Name schon sagt, zuständig dafür die Kind-Komponenten zu zeichnen.
Beispielsweise kannst du, wenn du diese Methode überschreibst und den super-Aufruf in eine if-Anweisung packst, vehindern, dass die Kind-Komponenten gezeichnet werden.

Falls ich heute noch dazu komme, mach ich dir noch ein Beispiel fertig.

Gruß

Sascha
 

mjkraus

Mitglied
Um für längere Fades eine korrekte Überblendung hinzubekommen reicht mir die Methode mit g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER), opacity) leider nicht. Deshalb habe ich mir folgedes Überlegt (die Ausführung klappt aber leider nicht):

Für die größeren Fades könnte ich da folgendes machen: Das ganze [Graphics-Objekt der Komponente] würde ich auf ein BufferedImage zeichnen, die enthaltenen Components entfernen und in einer Variablen zwischenparken [oder eben mit der paintChildren-Methode garnicht erst zeichnen lassen], das Graphics-Objekt durch das des BufferedImages ersetzen (da stellt sich die Frage wie kann ich das Ersetzen bewerkstelligen?) und dann die Komponente ausfaden (Für einfaden das ganze dann umgekert). Ist das so überhaupt realistisch?


Bei der Ersetzung des Graphics-Objekt der Komponente mit dem des BufferedImages hätte ich zuerst das Graphics-Objekt geleert [...] und dann das Image mit der aktuellen Transparenz des Fading-Prozesses gezeichnet.

ich hab mal etwas rumgespielt: Leider hat sich ein kleines Problem ergeben! Ich schaff es nicht das Graphics-Objekt komplett Tranparent zu löschen, diese beiden Möglichkeiten führen beide zu einer komlett schwarzen Fläche:

Java:
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, 100, 100);

Java:
g2d.setBackground(new Color(255, 255, 255, 0));
g2d.clearRect(0, 0, 100, 100);

Muss ich den Code irgendwie modifizieren oder einen komplett anderen Lösungsweg einschlagen? Gerade auch im Hinblick auf die Performance. Ich hoffe es ist verständlich ausgedrückt. :)