Swing透明和变换
来源:互联网 发布:西科软件 编辑:程序博客网 时间:2024/05/17 18:14
以前或许大家对一个UI组件是否透明没有那么关心,但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的Window一族就是没法透明和变形,原生代码的问题还是交给原生代码来解决吧。
自己写原生代码是可怕的,特别是对我这种只知道Java的平凡程序员,所以我们得借助一个非常方便的跨平台的调用OS function方便的Lib,JNA便是最佳选择(那个谁,这里不是讨论JRuby&JPython的)。
so, all robots, transform!
下面我们要做一个界面是圆角四边形的,中间有一个滑动条来滑动调节透明度。先看看做好的截图。
注意图中的JFrame边角已经变成了圆弧,滑动滑块,JFrame开始透明,桌面的图标显现出来,下面是代码。
利用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的平凡程序员,所以我们得借助一个非常方便的跨平台的调用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);
}
}
*@(#)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.jar 和 examples.jar ,都不是很大,只有200多K。
虽然这篇文章只是介绍了一下JNA关于Swing的简单用法,但是有了这个我最先到的便是可以做类似于Yahoo Widget和Google Widget之类的东西了,还可以做好看的fishEye,SideBar,JNA的JAR两个合起来不过400K,却能让这么多复杂的事情简单化,真是精湛的艺术啊,嗯。
0 0
- Swing透明和变换
- Swing透明和变换
- 透明和不规则 Swing 窗口
- 透明和不规则 Swing 窗口
- 透明和不规则 Swing 窗口
- 透明和不规则 Swing 窗口
- Java 透明和不规则 Swing 窗口
- Swing不规则窗口和窗口透明
- Swing 透明窗体和不规则窗体
- Java 透明和不规则 Swing 窗口
- 透明图片做背景和形状的方法swing
- Swing开发透明窗体
- Swing 透明窗体实现
- Swing 透明窗体实现
- swing 组件透明
- swing 窗体透明和窗体透明窗体里的空间不透明
- 关于Swing实现透明窗体
- JAVA-SWING:生成透明JTable
- 第四章 表达式
- Redhat Enterprise Linux中如何关闭SELinux?
- AJAX实例入门
- 在Struts2中集成Spring详细讲解
- UVA 424 Integer Inquiry
- Swing透明和变换
- 暑期个人赛--第三场--D
- 登陆验证码的生成
- centos下安装mysql步骤
- 总结spring下配置dbcp,c3p0,proxool数据源链接池
- cocos2d-x 3.1.1 学习笔记[21]cocos2d-x 创建过程
- 比较有用的log4j.properties
- oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法
- C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)