使用JNA的透明JFrame
在“ 使JFrame透明”中,我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误,该文章中还显示了Eclipse中的解析。 现在,这里是使用Java本机的版本。 我使用Java本机访问(JNA)库来调用本机函数来完成任务。
什么是Java本机访问(JNA) ?
JNA使Java程序可以轻松访问本机共享库(Windows上的DLL),而无需编写Java代码-无需JNI或本机代码。JNA允许您使用自然Java方法调用直接调用本机函数。
编码
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(); } }); } }
JNA jar(platform.jar)中提供了WindowUtils类。 WindowUtils类的方法setWindowAlpha 用于使窗口透明。 此方法的第一个参数是您的框架/窗口,第二个参数是alpha值。 此类还具有一个称为setWindowTransparent的方法,该方法还可用于使窗口透明。
依存关系
您将需要以下2个jar运行该程序:(两个jar文件都可以从GitHub上的JNA下载)。
- jna.jar
- platform.jar
要在Windows上运行以上代码,您需要在调用WindowUtils函数之前设置“ sun.java2d.noddraw”系统属性。
System.setProperty('sun.java2d.noddraw', 'true');
输出量
补充笔记
我已经在以下机器上测试了此代码:
- Windows XP Service Pack 3(32位)
- Windows 7(32位)
- Cent OS 5(32位)
如果您在其他计算机上对其进行测试,或者具有使用JNA的其他计算机代码以实现相同功能,则可以随时将其作为对此文章的评论进行共享。
祝您编程愉快,别忘了分享!
参考: harryjoy博客上使用我们JCG合作伙伴 Harsh Raval的JNA使用的透明JFrame 。
翻译自: https://www.javacodegeeks.com/2012/09/transparent-jframe-using-jna.html