Transparent JFrame using JNA
What is Java Native Access (JNA)?
JNA provides Java programs easy access to native shared libraries (DLLs on Windows) without writing anything but Java code—no JNI or native code is required.JNA allows you to call directly into native functions using natural Java method invocation.
The Code
import javax.swing.JFrame; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.sun.jna.platform.WindowUtils; public class TransparentFrame extends JFrame { public TransparentFrame() { setTitle('Transparent Frame'); setSize(400,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JSlider slider = new JSlider(JSlider.HORIZONTAL, 30, 100, 100); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { JSlider slider = (JSlider) e.getSource(); if(!slider.getValueIsAdjusting()){ WindowUtils.setWindowAlpha(TransparentFrame.this, slider.getValue()/100f); } } }); add(slider); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TransparentFrame(); } }); } }
Here WindowUtils class is provided in JNA jar (platform.jar). The method setWindowAlpha of WindowUtils class is used to make a window transparent. First argument of this method is your frame/window and second argument is alpha value. This class also has a method called setWindowTransparent, which can also be used to make window transparent .
Dependencies
You will need following 2 jars to run this program: (Both jar files are available to download on GitHub for JNA.)
- jna.jar
- platform.jar
To run above code on Windows, you will need to set “sun.java2d.noddraw” system property before calling the WindowUtils function.
System.setProperty('sun.java2d.noddraw', 'true');
Output
Additional Notes
I have tested this code on following machines:
- Windows XP service pack 3 (32 bit)
- Windows 7 (32 bit)
- Cent OS 5 (32 bit)
If you test it on other machines or have code for other machines using JNA for the same functionality then feel free to share it as comment to this post.
Happy coding and don’t forget to share!
Reference: Transparent JFrame using JNA from our JCG partner Harsh Raval at the harryjoy blog.
Does this allow for per-pixel transparency?