使用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');

输出量

使用JNA的透明JFrame

补充笔记

我已经在以下机器上测试了此代码:

  • 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