以前或许大家对一个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.jar 和 examples.jar ,都不是很大,只有200多K。
虽然这篇文章只是介绍了一下JNA关于Swing的简单用法,但是有了这个我最先到的便是可以做类似于Yahoo Widget和Google Widget之类的东西了,还可以做好看的fishEye,SideBar,JNA的JAR两个合起来不过400K,却能让这么多复杂的事情简单化,真是精湛的艺术啊,嗯。
分享到:
相关推荐
* 但是很不幸的是无论组件如何透明和变换,但是能够放置于屏幕任何位置的Window一族就是没法透明和变形,原生代码的问题还是交给原生代码来解决吧。 * 自己写原生代码是可怕的,特别是对我这种只知道Java的平凡...
压缩包中的"GraphicsFundamentals"可能包含了一些关于Swing图形基础的示例代码,这些代码可能涵盖基本的绘图操作、图形变换、颜色填充和组合,以及如何使用Swing组件创建动态视觉效果等内容。通过学习和理解这些代码...
"txt文本阅读器 实现字体颜色改变和文本背景变换"这个项目是一个专注于增强用户阅读体验的简易应用,它允许用户自定义文字的颜色和背景颜色,尽管目前还无法调整字体大小,但开发者正在进行相关改进。 在实现这个...
- `frc-chapter14.zip`可能涉及到图形的高级特性,如路径、变换和图像处理。 - `frc-chapter5.zip`和`frc-chapter18.zip`可能介绍了图形和动画的高级主题,如粒子系统或复杂的用户交互。 - `frc-chapter10.zip`和...
3. 颜色处理:使用Color类创建和操作颜色,包括透明度控制。 4. 图形碰撞检测:检测图形之间的接触,这对于游戏开发尤其重要。 5. 组件和布局管理器:如何在窗口中组织和排列图形组件。 6. 用户交互:响应鼠标和键盘...
Java图形图像处理主要涉及到Java的AWT(Abstract Window Toolkit)和Swing库,这两个库提供了丰富的功能来创建和操作图形、图像以及用户界面。LW(Lightweight)指的是轻量级组件,通常与Swing相关,而“LW+系统”...
`Graphics2D`扩展了`Graphics`,增加了更多的特性,如抗锯齿、透明度和变换。通过这些类,开发者可以创建自定义的组件,实现复杂的视觉效果。 **事件处理** 是GUI编程的重要组成部分。Java使用监听器模型来处理用户...
通过Java2D,开发者可以创建复杂的矢量图形、自定义形状、线条和曲线,甚至可以进行图像透明度和抗锯齿处理。Java3D API则专注于3D图形,允许开发者构建交互式的三维场景,常用于模拟、游戏和可视化应用。 在毕业...
RGB、CMYK等颜色模型和Alpha通道的概念会用于创建渐变、透明效果以及色彩组合。 7. **事件处理** 用户与图形的交互是任何图形项目不可或缺的一部分。Java的事件监听机制让我们可以响应用户的点击、拖动等动作,...
6. **坐标系统与变换**:理解二维坐标系统和坐标变换是图形学的基础。Java中的`AffineTransform`类可用于缩放、旋转和平移图形。 7. **动画原理**:通过定时器(如`javax.swing.Timer`)和重绘机制,可以实现动态的...
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 3D还支持动画和事件处理,使用户可以与3D世界进行交互。 在学习和应用计算机图形学时,你需要理解基本的数学概念...
4. **混合图像**:将原始图像和反射图像以合适的透明度叠加在一起,以创造出反射效果。 5. **绘制结果**:最后,使用Graphics2D对象在面板上绘制混合后的图像。 `DummyPanel.java` 可能是用来测试或演示反射效果的...
Java绘图是Java编程语言中的一个重要领域,它允许...Java绘图是一个广泛的主题,包括许多其他概念,如渲染、透明度、渐变和模板图像等。通过熟练掌握这些技术,开发者可以创建出具有复杂视觉效果和交互性的应用程序。
4. 图像处理算法:毕设可能涉及各种图像处理技术,如灰度转换、色彩空间变换(如RGB到HSV)、滤波器应用(如高斯滤波、中值滤波)、边缘检测(如Canny算法)、图像缩放和旋转、图像融合等。 5. 图像对象操作:通过...
Java提供了两种图形用户界面(GUI)工具包:Abstract Window Toolkit (AWT) 和 Swing。AWT是Java的基础GUI库,提供了基本的组件如按钮、文本框等,而Swing是建立在AWT之上的更高级库,提供了更多的功能和更好的跨...
在这个实例中,我们可能会用到`java.awt.Image`和`javax.swing.ImageIcon`来加载和显示图片,以及`java.awt.Graphics2D`来进行图像的绘制和变换。 2. **图像加载**: `ImageIcon` 类用于加载图片并将其显示在组件...
同时,`AffineTransform`类可用于执行图形的旋转、缩放和倾斜等变换操作,实现动态的图像特效。 在Swing中,`javax.swing.JLayer`和`javax.swing.layer.LayerUI`类允许开发者创建可插入的特效层,这种技术可以在不...