We can check if the transparent windows are supported by using the enum defined in WindowTranslucency.
Not all platforms support all the three forms of translucency.
The following code shows how to check for translucency support on a platform.
import static java.awt.GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT; import static java.awt.GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT; import static java.awt.GraphicsDevice.WindowTranslucency.TRANSLUCENT; //from w w w . ja v a 2s .c o m import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; public class Main { public static void main(String[] args) { GraphicsEnvironment graphicsEnv = GraphicsEnvironment .getLocalGraphicsEnvironment(); GraphicsDevice graphicsDevice = graphicsEnv.getDefaultScreenDevice(); boolean isSupported = graphicsDevice .isWindowTranslucencySupported(PERPIXEL_TRANSPARENT); System.out.println("PERPIXEL_TRANSPARENT supported: " + isSupported); isSupported = graphicsDevice.isWindowTranslucencySupported(TRANSLUCENT); System.out.println("TRANSLUCENT supported: " + isSupported); isSupported = graphicsDevice .isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT); System.out.println("PERPIXEL_TRANSLUCENT supported: " + isSupported); } }
The code above generates the following result.
The following code shows how to create a transparent window.
import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Main extends JFrame { public Main() { super(); JButton closeButton = new JButton("Close"); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setUndecorated(true); this.setOpacity(0.80f); this.setSize(200, 200); // Center it on the screen this.setLocationRelativeTo(null); this.add(closeButton, BorderLayout.SOUTH); closeButton.addActionListener(e -> System.exit(0)); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { Main frame = new Main(); frame.setVisible(true); }); } }
The following code uses JPanel to create a gradient effect from opaque at the left edge to gradually turning transparent at the right edge.
import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Paint; // w w w. j ava 2 s.com import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class Main extends JFrame { public Main() { this.setDefaultCloseOperation(EXIT_ON_CLOSE); // Make sure the frame is undecorated this.setUndecorated(true); this.setBackground(new Color(0, 0, 0, 0)); this.setSize(200, 200); // Center it on the screen this.setLocationRelativeTo(null); this.getContentPane().setLayout(new GridLayout(0, 1)); this.add(new TranslucentJPanel(Color.RED)); JButton closeButton = new JButton("Close"); this.add(closeButton); closeButton.addActionListener(e -> System.exit(0)); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { Main frame = new Main(); frame.setVisible(true); }); } } class TranslucentJPanel extends JPanel { private int red = 240; private int green = 240; private int blue = 240; public TranslucentJPanel(Color bgColor) { this.red = bgColor.getRed(); this.green = bgColor.getGreen(); this.blue = bgColor.getBlue(); } @Override protected void paintComponent(Graphics g) { int width = this.getWidth(); int height = this.getHeight(); float startPointX = 0.0f; float startPointY = 0.0f; float endPointX = width; float endPointY = 0.0f; Color startColor = new Color(red, green, blue, 255); Color endColor = new Color(red, green, blue, 0); Paint paint = new GradientPaint(startPointX, startPointY, startColor, endPointX, endPointY, endColor); Graphics2D g2D = (Graphics2D) g; g2D.setPaint(paint); g2D.fillRect(0, 0, width, height); } }
We can use Swing to create a custom shaped window by using the setShape(Shape s) method of the Window class.
The following three criteria must be met to use a shaped window:
import java.awt.BorderLayout; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; /*from w w w . j av a 2 s. co m*/ import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Main extends JFrame { public Main() { this.setUndecorated(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setSize(200, 200); Ellipse2D.Double ellipse = new Ellipse2D.Double(0, 0, 200, 100); Rectangle2D.Double rect = new Rectangle2D.Double(0, 100, 200, 200); Path2D path = new Path2D.Double(); path.append(rect, true); path.append(ellipse, true); this.setShape(path); JButton closeButton = new JButton("Close"); this.add(closeButton, BorderLayout.SOUTH); closeButton.addActionListener(e -> System.exit(0)); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { Main frame = new Main(); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } }