/*以前或许大家对一个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调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)java调用C#封装的dll(jna,com)
Java实现获取窗口句柄并操作窗口 JNA Java实现获取窗口句柄并操作窗口 JNA
Java JNA使用参考手册.pdf
MyEclipse 6.5 导入就可测试 绝对能跑起来 实现 java 通过 jna 包 调用dll
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
java 使用JNA读取ddl文件,亲测有效!
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native ...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
JNA方式实现Java调用dll的必用jar包
jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
jna java代码生成工具.rar
jna 的jar包,JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。
经过几天的奋战,终于让我搞懂了JNA的解析以及指针在结构体中的应用!!!下了很多的资料,里面包含c++的.h头文件,给需要帮助的人看看!! 里面包含代码以及解析过程。
java调用c++动态库例子,NetSdk.dll 文件拷贝至JDK/bin目录下
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
java通过jna调用c返回结构体例子,就是解决c语言返回结构体,java用类对象接收,包含jar包,java文件,c文件,操作步骤文档,在linux下完美通过
java调取窗口句柄所需要的JNA包,就当回报社会了。