`
sunxiang0918
  • 浏览: 46889 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用JNA实现JAVA组件半透明

    博客分类:
  • J2SE
阅读更多
/*以前或许大家对一个UI组件是否透明没有那么关心,
但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,
于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,
但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的 Window一族就是没法透明和变形,
原生代码的问题还是交给原生代码来解决吧。
自己写原生代码是可怕的,特别是对我这种只知道Java的平凡程序员,
所以我们得借助一个非常方便的跨平台的调用OS function方便的Lib,
JNA便是最佳选择(那个谁,这里不是讨论JRuby&JPython的)。*/



/**
 * @(#)TransparentFrame.java  v0.1.0  2007-10-21
 */
package ruislan.rswing.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.RoundRectangle2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.sun.jna.examples.WindowUtils;

/**
 * Transparent JFrame use JNA
 * 
 * @author ruislan <a href="mailto:z17520@126.com"/>
 * @version 0.1.0
 */
public class TransparentFrame {
    private JFrame frame;
    private JPanel container;
    private JSlider slider;
    private JPanel titleBar;
    private JLabel titleLabel;
    private JButton closeButton;

    public static void main(String[] args) {
        new TransparentFrame().launch();
    }

    private void launch() {
        createUI();
        launchUI();
    }

    protected void launchUI() {
        frame.setVisible(true);
    }

    protected void createUI() {
        System.setProperty("sun.java2d.noddraw", "true");
        frame = new JFrame();
        frame.setSize(200, 150);
        frame.setAlwaysOnTop(true);
        frame.setUndecorated(true);

        container = new JPanel();
        frame.setContentPane(container);
        container.setLayout(new BorderLayout());
        container.add(new JLabel("Ubunto vs Vista, I like both."),
                BorderLayout.CENTER);
        container.setBorder(new LineBorder(Color.BLACK));

        titleBar = new JPanel();
        titleBar.setLayout(new BorderLayout());
        titleLabel = new JLabel("JNA is great!");
        titleBar.add(titleLabel, BorderLayout.CENTER);
        titleBar.setBorder(new LineBorder(Color.GRAY));
        closeButton = new JButton("X");
        closeButton.setFocusPainted(false);
        closeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        titleBar.add(closeButton, BorderLayout.EAST);
        container.add(titleBar, BorderLayout.NORTH);

        slider = new JSlider(0, 100);
        slider.setValue(100);
        slider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                float value = slider.getValue();
                WindowUtils.setWindowAlpha(frame, value * 0.01f);
            }
        });
        container.add(slider, BorderLayout.SOUTH);
        RoundRectangle2D.Float mask = new RoundRectangle2D.Float(0, 0, frame
                .getWidth(), frame.getHeight(), 20, 20);
        WindowUtils.setWindowMask(frame, mask);
        centerWindow(frame);
    }

    public static void centerWindow(Container window) {
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        int w = window.getSize().width;
        int h = window.getSize().height;
        int x = (dim.width - w) / 2;
        int y = (dim.height - h) / 2;
        window.setLocation(x, y);
    }
}


/*
	 利用JNA来制作透明效果非常简单,只需要调用WindowUtils.setWindowAlpha(window, alpha) 就可以了。
	 当然这是JNA特别为UI写的工具代码。如果要改变形状,用WindowUtils.setWindowMask(window, shape)或者WindowUtils.setWindowMask(window, icon)就可以了,
	 但是要注意一点必须设置System.setProperty("sun.java2d.noddraw", "true"),
	 否则JNA会告诉你这个程序不支持透明。当然要运行起来,还得需要两个Jar,jna.jar 和 examples.jar ,
	 都不是很大,只有200多K。
    虽然这篇文章只是介绍了一下JNA关于Swing的简单用法,
	但是有了这个我最先到的便是可以做类似于Yahoo Widget和Google Widget之类的东西了,
	还可以做好看的fishEye,SideBar,JNA的JAR两个合起来不过400K,
	却能让这么多复杂的事情简单化,真是精湛的艺术啊,嗯。
*/
 
分享到:
评论

相关推荐

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    JNA 转java接口以及指针结构体解析

    在"JNA 转java接口以及指针结构体解析"这个主题中,我们将深入探讨如何使用JNA来处理C语言中的结构体和指针。 首先,理解JNA的基本工作原理至关重要。JNA通过定义一个`Interface`,该接口中的方法对应于要调用的...

    jna jar实现java调用dll

    标题"jna jar实现java调用dll"指的是使用JNA库来在Java程序中调用Windows平台上的动态链接库(DLL)文件。JNA通过jar包的形式提供服务,使得Java开发者可以方便地将DLL的功能集成到Java应用中。 描述中提到...

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理类型转换。 2. **JNA工作原理** - **结构体映射**:JNA允许Java对象直接映射到C结构体,反之亦然,通过提供`Structure`类和一...

    Java JNA使用参考手册.pdf

    ### Java JNA 使用参考手册知识点概述 #### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或...

    JNA方式实现Java调用dll的必用jar包

    标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来调用Windows平台上的动态链接库(.dll文件)所需的Java类库。这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA...

    JAVA-JNA简单使用

    Java Native Access(JNA)是Java平台上的一个...通过这些基础知识,初学者可以开始尝试使用JNA来调用本地库,实现Java与本地系统的交互。然而,要完全掌握JNA,还需要进一步学习和实践,理解其内部机制和优化技巧。

    基于JNA框架实现JAVA与读写器通信的研究.pdf

    JNA框架的工作原理是建立在JNI技术基础之上的一个JAVA类库,使编程人员可以方便地使用JAVA直接访问动态链接库中的函数,从而实现对.dll/.SO文件的访问。 使用JNA框架可以避免使用JNI技术的繁琐性,简化了JAVA与硬件...

    通过JNA让Java调用Dll方法

    研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。

    基于JNA的java调用DLL动态库实例

    JNA通过映射Java方法到本机函数,实现了跨语言的通信。 首先,确保已将"NetSdk.dll"文件复制到JDK的bin目录下。这是因为Java运行时环境会在这个目录下查找系统库。"NetSdk.dll"可能包含网络摄像头相关的功能,比如...

    java 使用JNA连接海康的硬盘录像机

    Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...

    使用JNA获取窗口句柄,并发送消息

    JNA的核心组件包括`platform-3.5.2.jar`和`jna-3.5.2.jar`,它们包含了必要的库和接口定义,使得Java代码能够与不同操作系统的原生API进行通信。 要获取窗口句柄,我们需要使用JNA的`User32`接口,这是Windows API...

    java通过jna返回结构体例子.rar

    本示例是关于如何在Java中使用JNA处理C语言返回的结构体数据。下面将详细介绍这个过程,以及如何在Linux环境下实现。 首先,我们需要了解JNA的基本概念。JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的...

    java 使用jna开启关闭第三方应用程序.txt

    java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序

    java_jna包

    在JNA中,本地函数的调用是通过定义一个接口并使用`native`关键字来实现的。这个接口将被JNA用来动态加载和调用对应的本地库函数。例如,如果要调用Windows API中的`FindWindow`函数来获取窗口句柄,可以这样定义: ...

    JNA(java和vc++之间调用)

    Java Native Access (JNA) 是一个Java库,它允许Java代码与本地平台API无缝交互,无需编写JNI(Java Native Interface)代码。通过JNA,Java应用程序可以直接调用C/C++编译的动态链接库(DLL),如在Windows系统中的...

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

    java用JNA调用dll实例,包含各种参数调用

    JNA通过映射DLL中的函数到Java类的方法来实现调用。你需要定义一个接口,该接口的每个方法对应DLL中的一个函数,然后使用`NativeLibrary`类加载DLL,并将接口实例化,这样就可以在Java中直接调用DLL函数了。 1. **...

    jna by java.rar

    在"jna by java.rar"这个压缩包中,很可能是包含了一个或多个示例,演示了如何使用JNA在Java程序中调用DLL。首先,我们需要理解JNA的基本工作原理。JNA通过映射Java接口到本地函数,实现了跨语言调用。它定义了一个`...

Global site tag (gtag.js) - Google Analytics