I want to add shadow to Undecorated jFrame. i have no idea about how to do that. anyone know about that?
-
What do you by *"I want to add shadow to Undecorated jFrame"*? You want to add a drop shadow "behind" the window or within the window? – MadProgrammer Jan 15 '14 at 10:20
-
@MadProgrammer you know how we add drop shadows to our images/screenshots we post here. I think that's what he means (behind). I've seen this question asked on different forums showing examples. Couldn't find an answer, just questions. – Paul Samsotha Jan 15 '14 at 10:25
-
@MadPegrammer. i mentioned behind the window – realProgrammer Jan 15 '14 at 10:29
-
@realProgrammer No, actually you mentioned "to"...Is the content of the window opaque or not? – MadProgrammer Jan 15 '14 at 10:30
-
@MadPegrammer. window content is not opaque – realProgrammer Jan 15 '14 at 10:40
1 Answers
This is a bit of a "cheat". This doesn't make a drop shadow behind the window so much as makes a drop shadow behind the content.
This method not only makes the window undecorated, but also transparent. The replacement "content pane" is partially filled allowing the shadow effect to "appear" behind it.
import com.jhlabs.image.GaussianFilter;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class TestImageDropShadow {
public static void main(String[] args) {
new TestImageDropShadow();
}
public TestImageDropShadow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new ShadowPane());
frame.setLayout(new BorderLayout());
frame.add(new JLabel(new ImageIcon("/you/own/pony")));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ShadowPane extends JPanel {
private BufferedImage shadow;
public ShadowPane() {
setOpaque(false);
setBorder(new EmptyBorder(10, 10, 10, 10));
}
@Override
public void invalidate() {
shadow = null;
super.invalidate();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
int x = insets.left;
int y = insets.top;
int width = getWidth() - (insets.left + insets.right);
int height = getHeight() - (insets.top + insets.bottom);
if (shadow == null) {
// Try and "guess" the amount of shadow we can show...
int shadowWidth = Math.min(Math.min(insets.left, insets.top), Math.min(insets.right, insets.bottom));
shadow = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = shadow.createGraphics();
g2d.setColor(getBackground());
g2d.fillRect(0, 0, width, height);
g2d.dispose();
shadow = generateShadow(shadow, shadowWidth, Color.BLACK, 0.5f);
}
System.out.println(insets);
g.drawImage(shadow, 0, 0, this);
g.setColor(getBackground());
g.fillRect(x, y, width, height);
}
}
public static void applyQualityRenderingHints(Graphics2D g2d) {
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
}
public static BufferedImage createCompatibleImage(int width, int height) {
return createCompatibleImage(width, height, Transparency.TRANSLUCENT);
}
public static BufferedImage createCompatibleImage(int width, int height, int transparency) {
BufferedImage image = getGraphicsConfiguration().createCompatibleImage(width, height, transparency);
image.coerceData(true);
return image;
}
public static BufferedImage createCompatibleImage(BufferedImage image) {
return createCompatibleImage(image, image.getWidth(), image.getHeight());
}
public static BufferedImage createCompatibleImage(BufferedImage image,
int width, int height) {
return getGraphicsConfiguration().createCompatibleImage(width, height, image.getTransparency());
}
public static GraphicsConfiguration getGraphicsConfiguration() {
return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
}
public static BufferedImage generateBlur(BufferedImage imgSource, int size, Color color, float alpha) {
GaussianFilter filter = new GaussianFilter(size);
int imgWidth = imgSource.getWidth();
int imgHeight = imgSource.getHeight();
BufferedImage imgBlur = createCompatibleImage(imgWidth, imgHeight);
Graphics2D g2 = imgBlur.createGraphics();
applyQualityRenderingHints(g2);
g2.drawImage(imgSource, 0, 0, null);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, alpha));
g2.setColor(color);
g2.fillRect(0, 0, imgSource.getWidth(), imgSource.getHeight());
g2.dispose();
imgBlur = filter.filter(imgBlur, null);
return imgBlur;
}
public static BufferedImage generateShadow(BufferedImage imgSource, int size, Color color, float alpha) {
int imgWidth = imgSource.getWidth() + (size * 2);
int imgHeight = imgSource.getHeight() + (size * 2);
BufferedImage imgMask = createCompatibleImage(imgWidth, imgHeight);
Graphics2D g2 = imgMask.createGraphics();
applyQualityRenderingHints(g2);
int x = Math.round((imgWidth - imgSource.getWidth()) / 2f);
int y = Math.round((imgHeight - imgSource.getHeight()) / 2f);
g2.drawImage(imgSource, x, y, null);
g2.dispose();
// ---- Blur here ---
BufferedImage imgGlow = generateBlur(imgMask, (size * 2), color, alpha);
return imgGlow;
}
}
Basically what happens here, is we first make the widnow transparent. Next we replace the content pane with our own, special ShadowPane
.
This panel is transparent and has an EmptyBorder
applied to. This ensures that anything added to it will fit within the area we want.
Next, we generate a BufferedImage
which represents the entire available space of the component, but we only fill the "viewable" area. We the apply a drop shadow to this and paint it to the component.
This example makes use of the GaussianFilter
from JHLabs
Strictly speaking, you don't need it, but it does provide a nice "fuzzy" effect
For an example of something little more complex, you could take a look at Java: create shadow effect on image

- 1
- 1

- 343,457
- 22
- 230
- 366
-
It tells me "This static method cannot hide the instance method from Component" in the method: getGraphicsConfiguration(). If I remove 'static' from all methods it runs but not the transparent effect. – tec Jan 25 '17 at 12:37
-
I changed it to getGraphicsConfiguration2() but still can't achieve the border transparent effect you show in the pictures. – tec Jan 25 '17 at 12:44
-
Solved, it was my JDialog background color. I didn't realize that 'new Color(0,0,0,0)' is different of 'Color.white'. – tec Jan 25 '17 at 18:29