`
xiamizy
  • 浏览: 85995 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
78437efc-ad8e-387c-847f-a092d52e81a6
spring framew...
浏览量:4756
社区版块
存档分类
最新评论

Swing透明和变换

 
阅读更多
以前或许大家对一个UI组件是否透明没有那么关心,但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的Window一族就是没法透明和变形,原生代码的问题还是交给原生代码来解决吧。
自己写原生代码是可怕的,特别是对我这种只知道Java的平凡程序员,所以我们得借助一个非常方便的跨平台的调用OS function方便的Lib,JNA便是最佳选择(那个谁,这里不是讨论JRuby&JPython的)。
so, all robots, transform!
下面我们要做一个界面是圆角四边形的,中间有一个滑动条来滑动调节透明度。先看看做好的截图。

注意图中的JFrame边角已经变成了圆弧,滑动滑块,JFrame开始透明,桌面的图标显现出来,下面是代码。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
*@(#)TransparentFrame.javav0.1.02007-10-21
*/
packageruislan.rswing.test;

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

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

importcom.sun.jna.examples.WindowUtils;

/**
*TransparentJFrameuseJNA
*
*
@authorruislan<ahref="mailto:z17520@126.com"/>
*
@version0.1.0
*/
publicclassTransparentFrame{
privateJFrameframe;
privateJPanelcontainer;
privateJSliderslider;
privateJPaneltitleBar;
privateJLabeltitleLabel;
privateJButtoncloseButton;

publicstaticvoidmain(String[]args){
newTransparentFrame().launch();
}

privatevoidlaunch(){
createUI();
launchUI();
}

protectedvoidlaunchUI(){
frame.setVisible(
true);
}

protectedvoidcreateUI(){
System.setProperty(
"sun.java2d.noddraw","true");
frame
=newJFrame();
frame.setSize(
200,150);
frame.setAlwaysOnTop(
true);
frame.setUndecorated(
true);

container
=newJPanel();
frame.setContentPane(container);
container.setLayout(
newBorderLayout());
container.add(
newJLabel("UbuntovsVista,Ilikeboth."),
BorderLayout.CENTER);
container.setBorder(
newLineBorder(Color.BLACK));

titleBar
=newJPanel();
titleBar.setLayout(
newBorderLayout());
titleLabel
=newJLabel("JNAisgreat!");
titleBar.add(titleLabel,BorderLayout.CENTER);
titleBar.setBorder(
newLineBorder(Color.GRAY));
closeButton
=newJButton("X");
closeButton.setFocusPainted(
false);
closeButton.addActionListener(
newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
System.exit(
0);
}
});
titleBar.add(closeButton,BorderLayout.EAST);
container.add(titleBar,BorderLayout.NORTH);

slider
=newJSlider(0,100);
slider.setValue(
100);
slider.addChangeListener(
newChangeListener(){
@Override
publicvoidstateChanged(ChangeEvente){
floatvalue=slider.getValue();
WindowUtils.setWindowAlpha(frame,value
*0.01f);
}
});
container.add(slider,BorderLayout.SOUTH);
RoundRectangle2D.Floatmask
=newRoundRectangle2D.Float(0,0,frame
.getWidth(),frame.getHeight(),
20,20);
WindowUtils.setWindowMask(frame,mask);
centerWindow(frame);
}

publicstaticvoidcenterWindow(Containerwindow){
Dimensiondim
=Toolkit.getDefaultToolkit().getScreenSize();
intw=window.getSize().width;
inth=window.getSize().height;
intx=(dim.width-w)/2;
inty=(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.jarexamples.jar ,都不是很大,只有200多K。
虽然这篇文章只是介绍了一下JNA关于Swing的简单用法,但是有了这个我最先到的便是可以做类似于Yahoo Widget和Google Widget之类的东西了,还可以做好看的fishEye,SideBar,JNA的JAR两个合起来不过400K,却能让这么多复杂的事情简单化,真是精湛的艺术啊,嗯。

分享到:
评论

相关推荐

    Swing透明切,美观啊(源码奉送)

    * 但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的Window一族就是没法透明和变形,原生代码的问题还是交给原生代码来解决吧。 * 自己写原生代码是可怕的,特别是对我这种只知道Java的平凡...

    Java核心技术II(第8版)

    7.8 透明与组合 7.9 绘图提示 7.10 图像的读取器和写入器 7.10.1 获得图像文件类型的读取器和写入器 7.10.2 读取和写入带有多个图像的文件 7.11 图像处理 7.11.1 构建光栅图像 7.11.2 图像过滤 7.12 打印 7.12.1 ...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    Java开发技术大全 电子版

    2.4.1算术运算符和算术表达式38 2.4.2关系运算符和关系表达式43 2.4.3逻辑运算符和逻辑表达式44 2.4.4条件运算符和条件表达式48 2.4.5位运算符和位运算表达式50 2.4.6赋值运算符和赋值表达式53 2.4.7表达式的...

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包2

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包3

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包4

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    基于opencv3.1库的JAVA源码

    范例4-2-4 使用webcam读取动态影像至Java Swing视窗2 92 范例4-2-5 手动拍照 94 范例4-2-6 使用webcam录制影片档 96 范例4-2-7 使用xuggle录制电脑画面 99 范例4-2-8 使用Opencv API录制影片档案 102 范例4-3-1 ...

Global site tag (gtag.js) - Google Analytics