课题2:不规则窗体与背景设计

上传人:豆浆 文档编号:49021758 上传时间:2018-07-22 格式:PPT 页数:24 大小:342.50KB
返回 下载 相关 举报
课题2:不规则窗体与背景设计_第1页
第1页 / 共24页
课题2:不规则窗体与背景设计_第2页
第2页 / 共24页
课题2:不规则窗体与背景设计_第3页
第3页 / 共24页
课题2:不规则窗体与背景设计_第4页
第4页 / 共24页
课题2:不规则窗体与背景设计_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《课题2:不规则窗体与背景设计》由会员分享,可在线阅读,更多相关《课题2:不规则窗体与背景设计(24页珍藏版)》请在金锄头文库上搜索。

1、Java高级应用开发钱 能 723975921 不规则窗体设计与实现课题二:不规则窗体与背景设计(一)不规则窗体设计l第一步,获取一个图片,作为裁切窗体的模 板;l第二步,取消窗体默认装饰,并为其添加自 定义鼠标监听,以实现常规的窗体拖动等事 件;l第三步,扫描图片像素,分拣不透明像素, 然后天生不规则外形,并以此裁切窗体;l第四步,设置窗体透明度,显示窗体第一步:获取图片l首先初始化一张图片,我们可以选择一张有透明部 分的不规则图片 (当然我们要选择支持Alpha(透明) 层的图片格式,如PNG),这张 图片将被用来生成 与其形状相同的不规则窗体 MediaTracker mt=new Me

2、diaTracker(this); img=Toolkit.getDefaultToolkit().createImage(“./ 兔33.png“); mt.addImage(img, 0);try mt.waitForAll(); catch (InterruptedException e) e.printStackTrace(); 第二步:取消窗体的默认装饰l首先取消窗体的默认装饰/设定窗体大小和图片一样大 this.setSize(img.getWidth(null), img.getHeight(null); /设定禁用窗体装饰,这样就取消了默认的窗体结构 this.setUndec

3、orated(true); /初始化用于移动窗体的原点 this.origin=new Point(); /调用AWTUtilities的setWindowShape方法设定本窗体为制定的Shape形状 AWTUtilities.setWindowShape(this,getImageShape(img); /设定窗体可见度 AWTUtilities.setWindowOpacity(this, 0.8f); this.setLocationRelativeTo(null)l由于取消了默认的窗体结构,所以我们要手动设置一下移动窗体的方法 addMouseListener(new MouseAd

4、apter() 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); ); addMouseMotionListener( new MouseMotio

5、nAdapter() public void mouseDragged(MouseEvent e) Point p = getLocation(); setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y ); );第三步:根据图片裁剪窗体l扫描图片像素,分拣不透明像素,然后天生 不规则外形,并以此裁切窗体;l定义方法实现将Image图像转换为Shape图形 public Shape getImageShape(Image img) l变量定义ArrayList x=new ArrayList(); ArrayList

6、y=new ArrayList(); int width=img.getWidth(null);/图像宽度 int height=img.getHeight(null);/图像高度 扫描像素矩阵l扫描像素矩阵:图片的像素信息的存储形式 有点像一个矩阵(二维数组),有规则的行和列 ,在java中,使用PixelGrabber类可以轻易获 取一张图片的像素矩阵信息,但是通过 getPixels()方法返回的像素信息却是一维数 组;/首先获取图像所有的像素信息 PixelGrabber pgr = new PixelGrabber(img, 0, 0, -1, -1, true); try pgr.

7、grabPixels(); catch (InterruptedException ex) ex.getStackTrace(); int pixels = (int) pgr.getPixels(); /循环像素 for (int i = 0; i 0 ? i%width-1:0); y.add(i%width=0 ? (i=0 ? 0:i/width-1):i/width); /获取像素的Alpha值 private int getAlpha(int pixel) return (pixel 24) 过滤透明像素l过滤透明像素:从像素数组中一次检出每个 像素,检查其是否透明,假如透明则放弃

8、该 像素点,够则将像素在矩阵(留意不是上面提 到的一维数组)中的坐标信息记录到两个List 中;/建立图像矩阵并初始化(0为透明,1为不透明) int matrix=new intheightwidth; for(int i=0;iheight;i+) for(int j=0;jwidth;j+) matrixij=0; /导入坐标ArrayList中的不透明坐标信息 for(int c=0;cx.size();c+) matrixy.get(c)x.get(c)=1; 在内存中天生不规则外形l在内存中天生不规则外形:像素分拣之后, 会得到两个长度相同的List,这两个List分别 记录了非透

9、明像素点在图片像素矩阵中的X坐 标和Y坐标,这里需要将二者融合到一个二维 数组中,融合之后的这个二维数组,跟原始 的像素矩阵一样大小,不同的是,它的的所 有点只有两个值:1或0,1代表非透明点,0代 表透明点。在内存中天生不规则外形l有了这个“特殊”的像素矩阵之后,还要在内存 中天生不规则外形,这个稍微有点饶,我尽 量说的具体一点:程序会遍历这个二维数组 ,跟踪每一个非透明像素(值为非0)点直到碰 到一个透明点或这一行结束(简单点说,就是 在每一行中检出连续的非透明点),然后基于 这些点,构建一个“区域“,java中由 Rectangle和Area类负责构建这个“区域“,最 后将这些连续的或不

10、连续的非透明块组合起 来天生一个Area对象,即大功告成,成功在 内存中天生了图片的外形!/* 由于Area类所表示区域可以进行合并,我们逐一水平“扫描“图像矩阵的每一行, * 将不透明的像素生成为Rectangle,再将每一行的Rectangle通过Area类的rec * 对象进行合并,最后形成一个完整的Shape图形 */ Area rec=new Area(); int temp=0; for(int i=0;iheight;i+) for(int j=0;jwidth;j+) if(matrixij=1) if(temp=0) temp=j; else if(j=width) if(t

11、emp=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; 第四步:设置窗体透明度,

12、显示窗体l实例化透明窗体,并显示。 Transparent Form s = new Transparent Form (); s.setDefaultCloseOperation(3); s.setVisible(true);(二)窗体背景设计与实现lJava背景的设置可以通过两种方法来实现: 一是通过利用标签来实现;一是通过面板实 现。2.1 使用标签实现窗体背景l标签本来是一种最简单的组件,为什么可以将 它设置为窗体的背景呢?l首先还是要了解框架JFrame中的层次结构:l最底层是JRootPanel第二层是JLayerPanel最上层就是内容面板ContentPanel一般我们将控件放

13、在ContentPane层上,也就 是说我们只需要将背景图片放在JFrame的第二 层JLayerPane上,再把内容面板ContentPane 设置为透明,则第二层JLayerPane上放置的图 片即成为内容面板的背景了。2.1.1 使用标签做背景的缺点l用JLabel来设置窗体背景,其扩展性比较差 ,且在标签上不能放置其他组件,比如:再 防止一个JButton,整个布局背景图就错乱了 。导致这种现象是因为Java加载组件是有顺 序的,作为背景的JLabel的代码一定要放在 全部组件代码的最后,这样JLabel的背景图 片才不会被其他组件遮住,从而使整个布局 错乱。所以采用这种方式来设置窗体

14、背景有 很大的局限性。2.2 通过面板JPanel实现窗体背景lJava中的容器是没有背景图片的属性,它只 有背景颜色,如果需要在JPanel面板上设置 窗体背景,就需要重写 paintComponent(Graphics g)方法,即把所 要设置的背景图片画上作为JPanel面板的背 景。2.2.1 实现步骤一l首先定义一个JPanel的子类 BackgroundPanel ,由于JPanel的构造方法 不能添加图像,因此在创建子类的时候先用 getImage载入一幅背景图片,在重写 paintComponent(Graphics g)方法时,利用 drawImage方法将其逐渐绘制到屏幕上

15、。其 代码如下:class BackgroundPanel extends JPanel/定义一个背景面板 Image bj; public BackgroundPanel() bj=Toolkit.getDefaultToolkit().getImage(“./兔33.png“); public void paintComponent(Graphics g) super.paintComponent(g); int bjWidth=bj.getWidth(this); int bjHeight=bj.getHeight(this);/定义图片的宽度和高度 int FWidth=this.getWidth(); int FHeight=this.getHeight();/定义窗口的宽度和高度 int x=(FWidth-bjWidth)/2; int y=(FHeight-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号