【Swing入门教程】Graphics的使用及五颜六色满天星的实现

     这几天,头一阵一阵地剧痛,但愿那是我睡得太晚或是工作太累的缘故,而不是因为我太想你。如果”我再次说我喜欢你“是if语句的条件,很想知道接下来会发生什么。然而,人生就是个没有goto的无限循环,或许我们每天在做重复的事,却无法返回原点。人生理应奋斗不止,却不能太乏味,让这天空飘起五颜六色的多种多样的星星吧。  

 

满天星

    又忙又累,那就来点轻松简单的把,上图实现的是每半秒钟出现一个任意边形的随机颜色渲染的星星。或许这一点意义都没有,纯粹是我闲着蛋疼。实现一个任意多半行即简单又复杂:

    用getStar(...)获得的只是一个Shape,没有颜色,没有形象,只是数学意义上的经过一定算法得到的多边形。如何把这个多边形显示出来并渲染成五颜六色呢,这就要了解了解Graphics了。

     一:Graphics

     Graphics可以说是Swing的灵魂。哦,这里说的Graphics是指Graphics和Graphics2D的统称。Graphics和Swing有关系吗,我用了那么多组件怎么没见过?那只说明你对Swing的了解只停留在表面,或者说现有的组件已满足了你的要求。但你翻遍Swing的所有组件找不到合适的时候怎么办呢,自己动手,丰衣足食。这时Graphics就派上用场了。你不防进各个组件的源码看看,到处都是Graphics的身影。看看源代码,你会发现,几乎所有的Swing组件都是通过Graphics绘制出来的。当然要做出美观绚丽的界面少不了各种各样的渲染。

 

     组件的渲染很简单:

  1. 获得一个Graphics(或Graphics2D)对象。
  2. 设置这个Graphics对象的属性。
  3. 用这个Graphics对象绘制图形基本元素。

     组件的千差万别也在于:

  1. 如果获取Graphics对象:是通过图像还是组件,或者给定一个。
  2. 在这个Graphics对象上设置哪些属性。
  3. 用这个Graphics对象执行什么制图操作。

     拥有点、面、线,就能把整个世界描绘出来。这个Graphics都有,再加上图形学中各种数学知识。还有什么做不出来呢。本例子用到的主要方法有:

  1. setPaint (Paint  paint):Graphics2D 上下文设置 Paint 属性。
  2. fillRect (int x, int y, int width, int height): 填充指定的矩形。
  3. setRenderingHint (RenderingHints.Key  hintKey, Object  hintValue): 为呈现算法设置单个首选项的值。
  4. fill (Shape  s): 使用 Graphics2D 上下文的设置,填充 Shape 的内部区域。
  5. drawString (String  str, int x, int y): 使用 Graphics2D 上下文中的当前文本属性状态呈现指定的 String 的文本。

     有了这些方法,把Shape画到面板上就轻而易举了:

 

     要充分看懂以上代码,下面这些介绍可能有点用;只是简单介绍,详细用法请查看javadoc:

     二:GeneralPath

     GeneralPath类表示根据直线、二次曲线和三次曲线构造的几何图形,其中可以指定一些规则。它是Shape接口的一个实现类。父类是Path2D,也是表示任意几何形状路径的简单而又灵活的形状。我们的多边形星星就是采用默认的非零旋绕规则生成的。用到的方法有:

  1. moveTo (float x, float y): 通过移动到指定的坐标(以 float 精度指定),将一个点添加到路径中。
  2. lineTo (float x, float y): 通过绘制一条从当前坐标到指定新坐标(以 float 精度指定)的直线,将一个点添加到路径中。
  3. closePath (): 通过绘制一条向后延伸到最后一个 moveTo 的坐标的直线,封闭当前子路径。
     三:GradientPaint

     GradientPaint类提供了使用线性颜色渐变模式填充 Shape 的方法,分周期渐变和非周期渐变两种。我们定义的天空是从上到下由深灰到浅灰渐变,地面是从距底部五分一处到底部由黑到深灰渐变。它的构造方法:

    GradientPaint (float x1, float y1, Color  color1, float x2, float y2, Color  color2)

    GradientPaint (float x1, float y1, Color  color1, float x2, float y2, Color  color2, boolean cyclic)

     四:RadialGradientPaint

     RadialGradientPaint 类提供使用圆形辐射颜色渐变模式填充某一形状的方式。用户可以指定两种或多种渐变颜色,此绘制将在颜色与颜色之间提供一个插值。星星就是采用这种渐变方式进行渲染的。这是一种非常有趣的渐变方式,通过不同的参数,可以实现绚丽多彩的图形。详情请看javadoc。

 

     好了,暂时就到这吧,附上全部代码:

      当星星有好几千个时会是什么情况呢:

星星3738个,内存使用基本不变

     细心的童鞋发现,即使星星达到好几千个,内存的使用几乎没有什么变化。如果把星星定义成一个组件,我不敢想象把几千个组件加到面板上去会是什么状况。

     后注:星星的生成算法是参考《Filthy Rich Clients》一书中的DrawShape例子,这里只不过是一个读书笔记罢了。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值