Purpose
This tutorial demonstrates usage of Translucent and Shaped Windows in Java Swing applications.Time to Complete
Approximately 30 minutes.Overview
As of the Java SE 6 update 10 (6u10) release, you can add translucent and shaped windows to your Swing applications. This functionality is part of the public AWT package in JDK 7. You can create windows of three forms-Window with uniform translucency : You can create window with uniform translucency where each pixel has the same translucency (or alpha) value.
Window with per-pixel translucency : You can create window where each pixel has its own alpha value. Make a part of the window translucent.
Window with any shape object : You can create windows with a certain shape like circle, oval etc.
Software and Hardware Requirements
The following is a list of software requirements:Prerequisites
Before starting this tutorial, you should have the software installed as listed under Software Requirements.
How to Implement Uniform Translucency
Windows with uniform translucency have the same translucency for each pixel.
You can create uniform translucency by invoking the setOpacity(float) method
in the Window class. The float argument passed to this method should be between
0 and 1. It represents the translucency of the window. The smaller the number,
the more transparent the window.The following example creates a window that is 55% opaque (45% translucent). If the underlying platform does not support translucent windows, the example exits.
1. | Create a New Project. Select File > New
Project. |
---|---|
2. | Select Java from the Categories
column and Java Application from the Projects
column and then click Next. |
3. | Perform the following steps. a. Name the project TranslucentWindow. b. Uncheck the Create Main Class check box. c. Click Finish. |
4. | Right-click TranslucentWindow Project and select New >
JFrame Form . |
5. | Name the JFrame TranslucentWindowDemo , package name demo,
and then click Finish. |
6. | Perform the following steps : a. Right-click TranslucentWindowDemo.java and select Open . b. Click Source tab. |
7. | Add the following import statements to the java class,
TranslucentWindow.java
import java.awt.*; import javax.swing.*; import java.awt.event.*; import static java.awt.GraphicsDevice.WindowTranslucency.*; |
8. | Write the following lines
of code in the main() method
to determine whether translucency is supported by your system’s
graphic device. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); Not all platforms support these capabilities. An UnsupportedOperationException exception is thrown when a platform that does not support these features. Hence it is best practice to first check that the platform supports the capability. The GraphicsDevice class provides isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency) method that you can use for this purpose. You can pass one of three enum values, defined in GraphicsDevice.WindowTranslucency, namely: PERPIXEL_TRANSLUCENT, TRANSLUCENT, PERPIXEL_TRANSPARENT. |
9. | Add the below code to the main
method to exit the program if translucency is not supported by the graphic
device. if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) { System.err.println("Translucency is not supported"); System.exit(0); } |
10. | Perform the following steps
to the constructor of the class,
TranslucentWindowDemo()
. 1. Delete the below NetBeans generated line of code. initComponents(); 2. Add the following lines to set the properties of the frame. super("TranslucentWindowDemo"); setLayout(new GridBagLayout()); setSize(300,200); setLocationRelativeTo(null); setUndecorated(true); getContentPane().setBackground(Color.blue); |
11. | Add the below code to the constructor to create a Button, Close and
add the button to the frame. JButton btnClose = new JButton("Close"); add(btnClose); |
12. | To the constructor, add event handling code to the Close button. ActionListener al; al = new ActionListener() { public void actionPerformed(ActionEvent ae) { System.exit(0); } }; btnClose.addActionListener (al); The Close button responds to click event and closes the Frame . |
13. | Perform the following changes to the run()
method . 1. Delete the below NetBeans generated line of code. new TranslucentWindowDemo().setVisible(true); 2. Next add the below lines of code. TranslucentWindowDemo tw = new TranslucentWindowDemo(); tw.setOpacity(0.55f); tw.setVisible(true); The above code performs the following : 1. Starts a thread to create the GUI. 2. Sets the transluency of the window to 55% . 3. Displays the window . |
14. | In the Projects pane, right-click TranslucentWindowDemo.java
and choose Run File. |
15. | The output with 55% translucent window will be as below. You
can click the Close button to close the Window. Note that the button is also affected by the uniform translucency. Setting the opacity affects the whole window, including any components that the window contains. You can test the application with different opacity values . |
How to implement Shaped Windows
A shaped window is an undecorated window whose appearance conforms to a specific shape . Pixels outside of the shape are transparent and reveal the background.
Java 7 allows you to create Window of various shapes. You can create circle, triangle, elliptic windows or more complex shape. You can create a shaped window by invoking the setShape(Shape) method in the Window class. The Shape passed to the method determines how the window is clipped.The following example creates an oval-shaped window. If the underlying platform does not support shaped windows, the example exits.
1. | Right-click TranslucentWindow Project and select New > JFrame
Form . |
---|---|
2. | Name the class ShapedWindowDemo, package name demo
and then click Finish. |
3. | Perform the following steps: 1. Right click ShapedWindowsDemo.java and select Open. 2. Click Source tab. |
4. | Add the following import statements to the java class,
ShapedWindowDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.Ellipse2D; import static java.awt.GraphicsDevice.WindowTranslucency.*; |
5. | Add the following lines of code in the main
method to determine whether translucency is supported by your
system’s graphic device. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); final boolean isTranslucencySupported= gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT); |
6. | Add the below code to the main
method to exit the program if translucency is not supported by
the graphic device. if (!gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT)) { System.err.println("Shaped windows are not supported"); System.exit(0); } |
7. | Perform the following steps
to the constructor of the class,
ShapedWindowDemo()
. 1. Delete the below NetBeans generated line of code. initComponents(); 2. Add the following lines of code . super("ShapedWindow"); setLayout(new GridBagLayout()); addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { setShape(new Ellipse2D.Double(0, 0, getWidth(), getHeight())); } }); setUndecorated(true); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(new JButton("I am a Button")); |
8. | In the Projects pane, right-click ShapedWindowDemo.java
and choose Run File. The output will be as below |
9. | Make the following changes to the run() method. 1. Delete the below line of code. new ShapedWindowDemo().setVisible(true); 2. Add the following lines of code . ShapedWindowDemo sw = new ShapedWindowDemo(); sw.setOpacity(0.7f); sw.setVisible(true); The above code is used to set the Transparency of the window to 70%. |
10. | In the Projects pane, right-click ShapedWindowDemo.java
and choose Run File. The output with 70% translucent shaped window will be as below. |