在“ 使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