Guten Tag!
Auf der Suche nach einer Möglichkeit, JAVA-Fenstern einen schicken Schatten zu verpassen, bin ich auf die Seite Java 2D - Drop Shadow On JInternalFrame gestoßen. Dort will jemand den "ShadowRenderer" von Guy Romain zum selben Zweck verwenden, der nicht nur für Leser von dessen Buch "Filthy Rich Clients" zugänglich ist.
Mithilfe ebendieser Klassen "ShadowRenderer" sowie der ebenfalls verfügbaren "GraphicsUtilities" und mittels Zeichnen auf eine ganz außen liegende "EmptyBorder" ist es mir auch gelungen, ein paar selbst dekorierten Dialog-Fenstern einen recht effektvollen Schattenwurf mitzugeben. Perfekt ist das Resultat zwar meiner Meinung nach noch nicht, da der Schatten bislang "nur" unterhalb und rechts vom Fenster geworfen wird, aber das lässt sich ja vielleicht noch ändern (falls jemand weiß, wie ... ?).
Im Moment habe ich mich mit diesem Punkt nicht weiter befasst, weil es zuvor ein sehr viel wichtigeres Problem zu lösen gilt, soll das Ganze auch für den normalen praktischen Gebrauch taugen:
Wie veranlasst man, dass beim Verschieben des Fensters ein neuer, für den geänderten Hintergrund passender Schatten erzeugt wird?
Hier zunächst einmal die entscheidende Code-Stelle, wie ich sie der genannten Web-Seite entnommen habe:
Offensichtlich muss man anlässlich eines Verschiebevorgangs obige paint-Methode zum Einsatz bringen, was ja auch nicht schwierig ist. Die Frage, wie häufig man diesen wohl ziemlich aufwendigen -- und auch zeitaufwendigen -- Prozess, so ein Schatten-(Buffered-)Image (= 'shadow') zu erzeugen, anstoßen kann/darf, soll erst mal unwichtig sein.
Woran es im Augenblick hakt, ist, dass es mir nicht gelingt, den jeweils neuen Schatten mit den NICHT (vom bereits existierenden Schatten) verdeckten Pixeln des Hintergrunds zu "verschmelzen". Was stattdessen passiert: Mit jeder Neu-Berechnung des Schattens wird dieser dunkler -- soweit ich das verstehe deshalb, weil eben der für die Berechnung maßgebliche Ausschnitt des Hintergrunds nach dem ersten Mal nicht mehr "jungfräulich" ist, sondern vom bereits vorhandenen Schatten, tja, überschattet ...
Wer weiß da Abhilfe?
Auf der Suche nach einer Möglichkeit, JAVA-Fenstern einen schicken Schatten zu verpassen, bin ich auf die Seite Java 2D - Drop Shadow On JInternalFrame gestoßen. Dort will jemand den "ShadowRenderer" von Guy Romain zum selben Zweck verwenden, der nicht nur für Leser von dessen Buch "Filthy Rich Clients" zugänglich ist.
Mithilfe ebendieser Klassen "ShadowRenderer" sowie der ebenfalls verfügbaren "GraphicsUtilities" und mittels Zeichnen auf eine ganz außen liegende "EmptyBorder" ist es mir auch gelungen, ein paar selbst dekorierten Dialog-Fenstern einen recht effektvollen Schattenwurf mitzugeben. Perfekt ist das Resultat zwar meiner Meinung nach noch nicht, da der Schatten bislang "nur" unterhalb und rechts vom Fenster geworfen wird, aber das lässt sich ja vielleicht noch ändern (falls jemand weiß, wie ... ?).
Im Moment habe ich mich mit diesem Punkt nicht weiter befasst, weil es zuvor ein sehr viel wichtigeres Problem zu lösen gilt, soll das Ganze auch für den normalen praktischen Gebrauch taugen:
Wie veranlasst man, dass beim Verschieben des Fensters ein neuer, für den geänderten Hintergrund passender Schatten erzeugt wird?
Hier zunächst einmal die entscheidende Code-Stelle, wie ich sie der genannten Web-Seite entnommen habe:
Java:
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
int w = getWidth();
int h = getHeight();
if (shadow == null || shadow.getWidth() != w || shadow.getHeight() != h) {
// recreate shadow if frame size changed
BufferedImage frameImg = GraphicsUtilities.createCompatibleTranslucentImage(
w - 2 * SHADOW_WIDTH, h - 2 * SHADOW_WIDTH);
super.paint(frameImg.createGraphics());
shadow = shadowRenderer.createShadow(frameImg);
}
g2.drawImage(shadow, 0, 0, null);
// Motif ALMOST honors the empty internal frame border
// comment this line out to see interesting artifacts in Motif LaF
g2.setClip(0, 0, w - 2 * SHADOW_WIDTH, h - 2 * SHADOW_WIDTH);
super.paint(g2);
g2.dispose();
}
Offensichtlich muss man anlässlich eines Verschiebevorgangs obige paint-Methode zum Einsatz bringen, was ja auch nicht schwierig ist. Die Frage, wie häufig man diesen wohl ziemlich aufwendigen -- und auch zeitaufwendigen -- Prozess, so ein Schatten-(Buffered-)Image (= 'shadow') zu erzeugen, anstoßen kann/darf, soll erst mal unwichtig sein.
Woran es im Augenblick hakt, ist, dass es mir nicht gelingt, den jeweils neuen Schatten mit den NICHT (vom bereits existierenden Schatten) verdeckten Pixeln des Hintergrunds zu "verschmelzen". Was stattdessen passiert: Mit jeder Neu-Berechnung des Schattens wird dieser dunkler -- soweit ich das verstehe deshalb, weil eben der für die Berechnung maßgebliche Ausschnitt des Hintergrunds nach dem ersten Mal nicht mehr "jungfräulich" ist, sondern vom bereits vorhandenen Schatten, tja, überschattet ...
Wer weiß da Abhilfe?