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

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的平凡...

    swing rich client

    压缩包中的"GraphicsFundamentals"可能包含了一些关于Swing图形基础的示例代码,这些代码可能涵盖基本的绘图操作、图形变换、颜色填充和组合,以及如何使用Swing组件创建动态视觉效果等内容。通过学习和理解这些代码...

    txt文本阅读器 实现字体颜色改变和文本背景变换

    "txt文本阅读器 实现字体颜色改变和文本背景变换"这个项目是一个专注于增强用户阅读体验的简易应用,它允许用户自定义文字的颜色和背景颜色,尽管目前还无法调整字体大小,但开发者正在进行相关改进。 在实现这个...

    Java动画、图形和极富客户端效果开发源码

    - `frc-chapter14.zip`可能涉及到图形的高级特性,如路径、变换和图像处理。 - `frc-chapter5.zip`和`frc-chapter18.zip`可能介绍了图形和动画的高级主题,如粒子系统或复杂的用户交互。 - `frc-chapter10.zip`和...

    JAVA画图形学(论文+源代码).zip

    3. 颜色处理:使用Color类创建和操作颜色,包括透明度控制。 4. 图形碰撞检测:检测图形之间的接触,这对于游戏开发尤其重要。 5. 组件和布局管理器:如何在窗口中组织和排列图形组件。 6. 用户交互:响应鼠标和键盘...

    java图形图象处理(LW+系统).rar

    Java图形图像处理主要涉及到Java的AWT(Abstract Window Toolkit)和Swing库,这两个库提供了丰富的功能来创建和操作图形、图像以及用户界面。LW(Lightweight)指的是轻量级组件,通常与Swing相关,而“LW+系统”...

    Java 图形设计Java 图形设计

    `Graphics2D`扩展了`Graphics`,增加了更多的特性,如抗锯齿、透明度和变换。通过这些类,开发者可以创建自定义的组件,实现复杂的视觉效果。 **事件处理** 是GUI编程的重要组成部分。Java使用监听器模型来处理用户...

    JAVA画图形学程序(论文+源代码).rar

    通过Java2D,开发者可以创建复杂的矢量图形、自定义形状、线条和曲线,甚至可以进行图像透明度和抗锯齿处理。Java3D API则专注于3D图形,允许开发者构建交互式的三维场景,常用于模拟、游戏和可视化应用。 在毕业...

    2DProject:计算机图形学2D最终项目

    RGB、CMYK等颜色模型和Alpha通道的概念会用于创建渐变、透明效果以及色彩组合。 7. **事件处理** 用户与图形的交互是任何图形项目不可或缺的一部分。Java的事件监听机制让我们可以响应用户的点击、拖动等动作,...

    基于JAVA的画图形学程序的设计与实现(毕设文档+源代码).zip

    6. **坐标系统与变换**:理解二维坐标系统和坐标变换是图形学的基础。Java中的`AffineTransform`类可用于缩放、旋转和平移图形。 7. **动画原理**:通过定时器(如`javax.swing.Timer`)和重绘机制,可以实现动态的...

    JAVA开发JAVA画图形学(论文+源代码)

    Swing的`javax.swing.JFrame`和`javax.swing.JPanel`类是创建窗口和自定义绘图面板的基础。 3. **图形坐标系统**: 在Java中,坐标系统通常以窗口左上角为原点(0,0),x轴向右延伸,y轴向下延伸。理解这个坐标系统...

    仿放大镜效果

    Java AWT和Swing是Java提供的两种用于创建GUI的库。AWT是Java最早提供的GUI库,而Swing是在AWT之上构建的,提供了更多的组件和功能。在Java中实现放大镜效果,我们通常会用到`java.awt.image.BufferedImage`类来处理...

    计算机图形学 应用java 2d和3d

    对象可以通过坐标系统和变换矩阵进行位置调整,而光照和材质属性则可以影响物体的外观。此外,Java 3D还支持动画和事件处理,使用户可以与3D世界进行交互。 在学习和应用计算机图形学时,你需要理解基本的数学概念...

    java 实现控件面板的镜面反射效果

    4. **混合图像**:将原始图像和反射图像以合适的透明度叠加在一起,以创造出反射效果。 5. **绘制结果**:最后,使用Graphics2D对象在面板上绘制混合后的图像。 `DummyPanel.java` 可能是用来测试或演示反射效果的...

    java绘图java绘图java绘图

    Java绘图是Java编程语言中的一个重要领域,它允许...Java绘图是一个广泛的主题,包括许多其他概念,如渲染、透明度、渐变和模板图像等。通过熟练掌握这些技术,开发者可以创建出具有复杂视觉效果和交互性的应用程序。

    java图形图象处理毕设论文源代码程序

    4. 图像处理算法:毕设可能涉及各种图像处理技术,如灰度转换、色彩空间变换(如RGB到HSV)、滤波器应用(如高斯滤波、中值滤波)、边缘检测(如Canny算法)、图像缩放和旋转、图像融合等。 5. 图像对象操作:通过...

    JAVA开发java图形图象处理(论文+系统)

    Java提供了两种图形用户界面(GUI)工具包:Abstract Window Toolkit (AWT) 和 Swing。AWT是Java的基础GUI库,提供了基本的组件如按钮、文本框等,而Swing是建立在AWT之上的更高级库,提供了更多的功能和更好的跨...

    Java图片倒影效果实例源码

    在这个实例中,我们可能会用到`java.awt.Image`和`javax.swing.ImageIcon`来加载和显示图片,以及`java.awt.Graphics2D`来进行图像的绘制和变换。 2. **图像加载**: `ImageIcon` 类用于加载图片并将其显示在组件...

    java特效的显示以及源代码

    同时,`AffineTransform`类可用于执行图形的旋转、缩放和倾斜等变换操作,实现动态的图像特效。 在Swing中,`javax.swing.JLayer`和`javax.swing.layer.LayerUI`类允许开发者创建可插入的特效层,这种技术可以在不...

Global site tag (gtag.js) - Google Analytics