Translucent JFrame border JDK 7

java, jframe, swing, translucency, user-interface

Solution

I've just solved my problem. The problem was, that JDK 7 implements `AWTUtilities.setWindowOpaque()` method from JDK6 in `setBackground()` method and I was (NetBeans did :-)) setting default background for JFrame in different place, so setting background to `new Color(0, 0, 0, 0);` makes JFrame transparent and all goes well now.

Problem

I was asking question about Translucent JFrame border (see here) and I got very good answers, but unfortunatelly, given answers work perfectly only on JDK 6, but not 7. Any ideas how to make it work with JDK 7? In JDK 6 it looks like this: And JDK 7: And my code looks like this: ``` import java.awt.*; 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.border.AbstractBorder; public class ShadowBorder extends AbstractBorder { private static final int RADIUS = 30; private static BufferedImage shadowTop; private static BufferedImage shadowRight; private static BufferedImage shadowBottom; private static BufferedImage shadowLeft; private static BufferedImage shadowTopLeft; private static BufferedImage shadowTopRight; private static BufferedImage shadowBottomLeft; private static BufferedImage shadowBottomRight; private static boolean shadowsLoaded = false; public ShadowBorder() { if (!shadowsLoaded) { try { shadowTop = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top.png")); shadowRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-right.png")); shadowBottom = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom.png")); shadowLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-left.png")); shadowTopLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top-left.png")); shadowTopRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-top-right.png")); shadowBottomLeft = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom-left.png")); shadowBottomRight = ImageIO.read(getClass().getResource("/cz/vutbr/fit/assets/shadow-bottom-right.png")); shadowsLoaded = true; } catch (IOException ex) { Logger.getLogger(ShadowBorder.class.getName()).log(Level.SEVERE, null, ex); } } } @Override public boolean isBorderOpaque() { return false; } @Override public Insets getBorderInsets(Component c) { return new Insets(RADIUS, RADIUS, RADIUS, RADIUS); } @Override public Insets getBorderInsets(Component c, Insets insets) { insets.top = RADIUS; insets.left = RADIUS; insets.bottom = RADIUS; insets.right = RADIUS; return insets; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_ATOP, 1f)); int recWidth = width - (2 * RADIUS); int recHeight = height - (2 * RADIUS); int recX = width - RADIUS; int recY = height - RADIUS; //edges g2d.drawImage(shadowTop.getScaledInstance(recWidth, RADIUS, Image.SCALE_REPLICATE), RADIUS, 0, null); g2d.drawImage(shadowRight.getScaledInstance(RADIUS, recHeight, Image.SCALE_REPLICATE), recX, RADIUS, null); g2d.drawImage(shadowBottom.getScaledInstance(recWidth, RADIUS, Image.SCALE_REPLICATE), RADIUS, recY, null); g2d.drawImage(shadowLeft.getScaledInstance(RADIUS, recHeight, Image.SCALE_REPLICATE), 0, RADIUS, null); //corners g2d.drawImage(shadowTopLeft, 0, 0, null); g2d.drawImage(shadowTopRight, recX, 0, null); g2d.drawImage(shadowBottomLeft, 0, recY, null); g2d.drawImage(shadowBottomRight, recX, recY, null); } } ``` Thanks a lot!

Original source

Related problems