- 浏览: 1407510 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
nakin1991:
[b][b][b][u][/u][/b][/b][/b]
Spring学习笔记(9)----让Spring自动扫描和管理Bean -
bishibaodian:
不要在这样找笔试题了,一次就这么几个,还没过瘾就没有了,去安装 ...
java笔试试题 -
长白LZ:
very good
周鸿祎在360新员工入职培训上的讲话 -
blacklong:
多谢楼主,哈哈~~
在线购物系统(J2EE 含源码) -
gergul:
没有效果。。而且有广告。
C#水波纹特效自定义控件
JAVA程序的外表总是一板一眼的,看多了难免审美疲劳,能不能使我们的JAVA程序外观变得更美观更独特呢?答案是肯定的,我们可以让JAVA程序根据图片来生成自定义的不规则窗体。比如下图的这种外观:
图中的这个人物(蕾米莉亚)便是定义好的不规则窗体,怎么样?很漂亮吧!那么让我们开始学习吧。
首先要说明一下,本方法是基于com.sun.awt.AWTUtilities这个类实现的,而这个类只能在jdk-6u10版本以后的版本才能体现出来的,在本文中讨论的所有 API 在新 com.sun.awt.AWTUtilities 类中出现,该类不是官方支持的部分 API。它在 Java SE 7 中的位置最有可能发生改变,签名方法可能在现在和最终的 Consumer JRE 发行之间发生轻微变化。
所以当你的JDK版本不匹配的时候需要你将JDK插件更新。
地址: http://java.sun.com/javase/downloads/index.jsp
好了,准备工作妥当,下面就让我们通过代码来学习根据图片制作不规则窗体的方法。
=================================================================
地址: http://java.sun.com/javase/downloads/index.jsp
好了,准备工作妥当,下面就让我们通过代码来学习根据图片制作不规则窗体的方法。
=================================================================
IrregularFormSample.java
import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.Area; import java.awt.image.PixelGrabber; import java.io.IOException; import java.util.ArrayList; import javax.swing.JFrame; import com.sun.awt.AWTUtilities; /** * 不规则窗体示例 * @author Hexen */ public class IrregularFormSample extends JFrame { private static final long serialVersionUID = 1L; private Point origin; //用于移动窗体 private Image img; //用来设定窗体不规则样式的图片 public IrregularFormSample() { super(); /* 首先初始化一张图片,我们可以选择一张有透明部分的不规则图片 * (当然我们要选择支持Alpha(透明)层的图片格式,如PNG),这张 * 图片将被用来生成与其形状相同的不规则窗体 */ MediaTracker mt=new MediaTracker(this); img=Toolkit.getDefaultToolkit().createImage("remi.png"); mt.addImage(img, 0); try { mt.waitForAll(); } catch (InterruptedException e) { e.printStackTrace(); } try { initialize();//窗体初始化 } catch (IOException e) { e.printStackTrace(); } } /** * 窗体初始化 * @throws IOException */ private void initialize() throws IOException { //设定窗体大小和图片一样大 this.setSize(img.getWidth(null), img.getHeight(null)); //设定禁用窗体装饰,这样就取消了默认的窗体结构 this.setUndecorated(true); //初始化用于移动窗体的原点 this.origin=new Point(); //调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状 AWTUtilities.setWindowShape(this,getImageShape(img)); //设定窗体可见度 AWTUtilities.setWindowOpacity(this, 0.8f); this.setLocationRelativeTo(null); //由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法 addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e){ origin.x = e.getX(); origin.y = e.getY(); } //窗体上单击鼠标右键关闭程序 public void mouseClicked(MouseEvent e) { if(e.getButton()==MouseEvent.BUTTON3) System.exit(0); } public void mouseReleased(MouseEvent e) { super.mouseReleased(e); } @Override public void mouseEntered(MouseEvent e) { repaint(); } } ); addMouseMotionListener( new MouseMotionAdapter(){ public void mouseDragged(MouseEvent e){ Point p = getLocation(); setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y ); } } ); } /** * 将Image图像转换为Shape图形 * @param img * @param isFiltrate * @return Image图像的Shape图形表示 * @author Hexen */ public Shape getImageShape(Image img) { ArrayList<Integer> x=new ArrayList<Integer>(); ArrayList<Integer> y=new ArrayList<Integer>(); int width=img.getWidth(null);//图像宽度 int height=img.getHeight(null);//图像高度 //筛选像素 //首先获取图像所有的像素信息 PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true); try { pgr.grabPixels(); } catch (InterruptedException ex) { ex.getStackTrace(); } int pixels[] = (int[]) pgr.getPixels(); //循环像素 for (int i = 0; i < pixels.length; i++) { //筛选,将不透明的像素的坐标加入到坐标ArrayList x和y中 int alpha = getAlpha(pixels[i]); if (alpha == 0){ continue; }else{ x.add(i%width>0 ? i%width-1:0); y.add(i%width==0 ? (i==0 ? 0:i/width-1):i/width); } } //建立图像矩阵并初始化(0为透明,1为不透明) int[][] matrix=new int[height][width]; for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ matrix[i][j]=0; } } //导入坐标ArrayList中的不透明坐标信息 for(int c=0;c<x.size();c++){ matrix[y.get(c)][x.get(c)]=1; } /* 由于Area类所表示区域可以进行合并,我们逐一水平"扫描"图像矩阵的每一行, * 将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec * 对象进行合并,最后形成一个完整的Shape图形 */ Area rec=new Area(); int temp=0; for(int i=0;i<height;i++){ for(int j=0;j<width;j++){ if(matrix[i][j]==1){ if(temp==0) temp=j; else if(j==width){ if(temp==0){ Rectangle rectemp=new Rectangle(j,i,1,1); rec.add(new Area(rectemp)); }else{ Rectangle rectemp=new Rectangle(temp,i,j-temp,1); rec.add(new Area(rectemp)); temp=0; } } }else{ if(temp!=0){ Rectangle rectemp=new Rectangle(temp,i,j-temp,1); rec.add(new Area(rectemp)); temp=0; } } } temp=0; } return rec; } /** * 获取像素的Alpha值 * @param pixel * @return 像素的Alpha值 */ private int getAlpha(int pixel) { return (pixel >> 24) & 0xff; } /* 我们可以选择在窗体上绘制图片,是窗体完全呈现出图片的样式, * 当然我们也可以根据需要不绘制它,而采取其他操作 */ @Override public void paint(Graphics g) { super.paint(g); g.drawImage(img, 0, 0, null); } public static void main(String[] args) { IrregularFormSample sample = new IrregularFormSample(); sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); sample.setVisible(true); } }
使用这种方法,我们可以自由的定义窗体外观,使我们的JAVA程序更加美观。现在就去尝试一下吧!
本文出自 “和谐的HeXen” 博客
发表评论
-
十步让你成为一名优秀的Web开发人员
2010-01-21 09:55 3328如果你已经是一名优秀的Web开发人员,那请路过即可。如果你还是 ... -
Java相对路径读取文件
2010-01-15 15:56 3163不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文 ... -
Java反射
2010-01-14 09:46 20003Java的反射非常强大,传递class, 可以动态的生成该类、 ... -
J2EE项目架构最佳实践
2010-01-03 12:04 4391基于项目的最差实践, ... -
推荐一些国产开源项目
2010-01-01 09:22 8253Easyjf Easyjf是一个国产的开源社区,开源项目众多 ... -
单态模式和静态类的区别
2009-12-02 20:12 2504刚刚接到一个公司电话面试的一个题目,单态模式和静态类的区别,平 ... -
统计腾讯2010校园招聘南京站笔试人员
2009-10-24 20:38 2953一直关注腾讯的校园招聘,今天终于公布我们南京站的笔试名单,好奇 ... -
线程间数据共享
2009-10-12 10:15 3373当多个线程的执行代码来自同一个类的run方法,既称他们 ... -
多线程简单实例
2009-10-12 09:56 1426在Java程序中创建多线程有两种方法:继承Thread类和实现 ... -
Java对对象进行保存和读取
2009-10-08 21:59 1916import java.io.FileInputStream; ... -
Java处理压缩文件
2009-10-08 21:43 2814import java.io.BufferedReader; ... -
Java读写二进制文件操作
2009-10-08 21:23 64571/** * 二进制读写文件 */ import ja ... -
使用Jdom对xml文件进行基本操作
2009-10-06 09:50 1698使用Jdom对xml文件进行基本操作演示 注:创建后的 ... -
Hibernate创建表成功,但数据库中却没有表的解决方法
2009-10-02 15:12 4441注意:测试数据库为Mysql ... -
Java读写文件的几种方法
2009-09-25 20:18 3403Java读写文件的几种方法 import java.i ... -
java获得键盘输入的两种方法
2009-09-25 19:24 5745java获得键盘输入的两种方法 import java ... -
Java中文乱码问题的解决方案
2009-08-21 21:22 3216只要掌握了中文乱码问题产生的原因,然后对症下药,就可以顺利地解 ...
相关推荐
不规则窗体 不规则窗体不规则窗体 不规则窗体不规则窗体 不规则窗体不规则窗体 不规则窗体
用Java实现透明和不规则窗体,区别Java awt和swing组件
NULL 博文链接:https://yshjava.iteye.com/blog/1325330
VB 不规则窗体 VB 不规则窗体 VB 不规则窗体
Delphi 根据图片绘制不规则窗体 判断图片周围空白处绘制,具体代码参考附件
Java俄罗斯方块(不规则窗体)版,供大家学习交流,一共有三个主题,希望大家喜欢。
C# 不规则窗体 C# 不规则窗体
MFC 绘制不规则窗体 示例代码 实现根据图片,绘制不规则窗体,窗体拖动绘制
以前想制作不规则窗体,大多使用API函数来实现,在C#中,也可以不使用API函数照样能制作出漂亮的不规则窗体,这里就介绍一下相关方法。 来自:翔宇网
C#实现的创建不规则自定义窗体。 1)界面美观 2)自定义
不规则窗体 WPF应用案例.
C# winfrom 不规则窗体实例 C# winfrom 不规则窗体实例 C# winfrom 不规则窗体实例 C# winfrom 不规则窗体实例 C# winfrom 不规则窗体实例
Java实现不规则窗体,透明窗体,JDK1.6新特性..演示源代齐全..
java 魔力弹球 不规则窗体 可移动窗体 留有接口 可供自由开发
如题,C#不规则、无边框、可拖动、可关闭窗体,有需要的各位同学情下载~
制作不规则窗体的教程。制作不规则窗体的教程。制作不规则窗体的教程。
不规则窗体&异形窗体 Visual C#编写
不规则窗体的大体构建思路与以前没有什么不同,在这里,我仅陈述在java中怎样实现它。本次内容在eclipse平台下开发,需要swt 的插件,可以到swt的官方网站www.swt-designer.com去下载。
VC创建不规则窗体:创建多边形轮廓的窗体和自定义轮廓的窗体
WPF实现的一个不规则窗体的实例,WPF实现的一个不规则窗体的实例,