JComponent ein- und ausfaden

mjkraus

Mitglied
Hallo!

Ich würde gerne einen JComponent (inklusive aller möglicherweise darin enthaltener Komponenten) aus- und einfaden. Wie kann ich das bewerkstelligen? Ich dachte mir eventuell über die Funktion paintComponent(). Aber wie?

Thx!
 
Zuletzt bearbeitet:

zerix

Hausmeister
Moderator
Hallo,

wenn du die komplette Component ausfaden möchtest, darfst du nicht die paintComponent() nehmen. Diese Methode ist nur für die Komponente selbst da und nicht für die Childs oder die Border. Sonst müsstest du paintChild und paintBorder auch noch überschreiben.
Hier kannst du jetzt einfach die paint()-Methode überschreiben.

Bei Fade wird ja eine Komponente vom unsichtbar langsam sichtbar, bzw von transparent langsam nicht mehr transparent und umgekehrt.

Das kannst du über das AlphaComposite lösen.

Hier ist ein Beispiel wie man eine Component halb-transparent zeichnet.
Java:
Graphics2D g2d = (Graphics2D)g;

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER), 0.5f); 
super.paint(g2d);
g2d.dispose();

Wenn du ein Fading hinbekommen möchtest, musst du den Alphawert ändern (0.5f im Beispiel).
Also du müsstest einen Thread starten, der in der den Alpha-Wert hochzählt zu 1 wenn die Component sichtbar werden soll und zu 0 wenn sie unsichtbar werden soll. Dementsprechend muss du vorher bzw nachher die setVisible-Methode aufrufen.

Diesen Thread darfst du aber nicht in der paint-Methode haben, sondern du solltest den Wert über Getter- und Setter setzen und dann vielleicht eine Methode schreiben setFadeVisible(boolean).

Gruß

Sascha
 

mjkraus

Mitglied
Hallo!

vielen Dank für die Antwort, ich hab es auch gleich ausprobiert. Leider habe ich ein kleines Problem festgestellt: Wenn ich auf das Graphics- bzw. Graphics2D-Objekt zeichne wird alles einzeln transparent übereinander gelegt (siehe Anhang links). Allerdings möchte ich, dass beim Faden alles komplett einmal transparent wird (siehe Anhang rechts). Ich hoffe ich habe mich verständlich ausgedrückt.

Thx!
 

Anhänge

  • bild.png
    bild.png
    215 Bytes · Aufrufe: 24

zerix

Hausmeister
Moderator
Ich weiß schon was du möchtest. Für Fading einer JComponent kannst du das so machen, sowas dauert normal nur so ca 0.3 - 0.5 sek. Habe ich öfter schon so gelöst.

Wenn du mehr Zeit bräuchtest, wäre meine Idee, dass du die Component erstmal alles auf ein BufferedImage zeichnest. Die Component entfernst, das Image darstellt und dieses auf die gleiche Art verschwinden lässt.

Gruß

Sascha
 

mjkraus

Mitglied
Stimmt! Für die kürzeren Fades nehme ich dann die Lösung aus Post 2 her.

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?
 
Zuletzt bearbeitet:

mjkraus

Mitglied
Hallo,

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);

Was mache ich falsch?

Thx!
 

mjkraus

Mitglied
Ich möchte das Graphics-Objekt komplett leeren, so dass es überall 100% transparent und mit keiner Farbe gefüllt ist. Mit beiden genannten Möglichkeiten ist die Fläche nachher komplett schwarz.
 

zerix

Hausmeister
Moderator
Welchen Effekt möchtest du denn erzielen? Möchtest du, dass alles was dort gezeichnet wurde, entfernt wird? Versuchst du es in der gleichen Komponente zu entfernen, in der es gezeichnet wurde?

Gruß

Sascha