知识大全 水晶之恋

Posted

篇首语:三更灯火五更鸡,正是男儿读书时。黑发不知勤学早,白首方悔读书迟。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 水晶之恋相关的知识,希望对你有一定的参考价值。

Java Swing也惊艳之一:水晶之恋  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 序言

  关于 Java做不好桌面 的争论已经由来已久 虽然Swing和Java D已经有超过十年的历史 也有JIDE JGoodies aver等不少开源Swing组件 但是用Java做桌面程序仍然不是一件轻松的事 本《Java也惊艳》系列文章 就是想通过一些简单生动的例子 和大家一起认识Java 探索Swing 其实你只需要多一点创意 多一点耐心 你的Java程序也可以 惊艳 !本文就带您一起进入Java的 水晶之恋

  二 立体水晶效果

  受苹果公司的影响 现在立体水晶风格的界面非常流行 Java也可以吗?我们不妨先尝试一下用Java绘制一个立体水晶风格的按钮到底有多难 一个立体的水晶按钮应当有一个图标 一个圆角矩形区域 边框以及一些立体反光效果 如下图

  

  简单思路如下 先画矩形区域 然后画图标 然后设置clip并画高亮反光区域 最后画外部边框

  具体实现比较简单 主要代码如下

   Color color = averUtil getRandomColor();  RoundRectangle D body = new RoundRectangle D Float(x  y  size  size  size /   size /  ); //draw body g d setColor(color); GradientPaint paint = new GradientPaint(x                      y                      color darker()                      x                      y + size                      color brighter() brighter()); g d setPaint(paint); g d fill(body); //draw image g d setClip(body); Image image = averUtil getImage( /glass/  + i +  png ); g d drawImage(image                 x + (size   image getWidth(null)) /                  y + (size   image getHeight(null)) /                  null); g d setClip(null); //draw highlight  Shape highlightArea = createHighlightShape(x  y  size  body); g d setColor(new Color(       )); g d fill(highlightArea); //draw outline  g d setColor(color darkGray); g d draw(body);

  其中 对高亮区域的计算 可以用一个圆心在左上方的大圆形和矩形进行剪切

   private static Shape createHighlightShape(int centerX  int centerY  int size  Shape body)  double myRadius = size *  ;   double x = centerX   size *  ;   double y = centerY   size *  ;   Ellipse D Double circle = new Ellipse D Double(x  y  myRadius  myRadius);   Area area = new Area(circle);   area intersect(new Area(body));   return area; 

  运行程序效果如下

  

  三 更多变化

  根据上面例子稍作形状变换 可以画出立体水晶球的按钮

   Color color = averUtil getRandomColor(); Ellipse D Double circle = new Ellipse D Double(centerX   radius  centerY   radius  radius *   radius *  ); //draw body g d setColor(color); GradientPaint paint = new GradientPaint(centerX  centerY  color  centerX  centerY + radius *   color brighter() brighter()); g d setPaint(paint); g d fill(circle); //draw image g d setClip(circle); Image image = averUtil getImage( /glass/  + i +  png ); g d drawImage(image  centerX   image getWidth(null) /                    centerY   image getHeight(null) /                    null); g d setClip(null); //draw highlight  Shape highlightArea = createHighlightShape(centerX  centerY  radius); g d setColor(new Color(       )); g d fill(highlightArea);

  唯一略有不同的部分是 水晶球的高亮区域要用两个圆形拼切

   private static Shape createHighlightShape(int centerX  int centerY  int radius)  double myRadius = radius *  ;   double x = centerX   myRadius;   double y  = centerY   myRadius   myRadius /  ;   double y  = centerY   myRadius   myRadius /   *  ;   Ellipse D Double circle  = new Ellipse D Double(x  y  myRadius *   myRadius *  );   Ellipse D Double circle  = new Ellipse D Double(x  y  myRadius *   myRadius *  );   Area area = new Area(circle );   area intersect(new Area(circle ));   return area; 

  运行效果如下

  

  如果再来点儿循环 随机大小 随机位置 随机颜色 就可以做出绚丽的 吹肥皂泡 的效果

  

  四 融入Swing组件

  以上例子仅使用了Java D进行绘图 在实际使用中 需要将这些效果应用的Swing组件中 例如按钮等 一个简单的方式是 将以上图形效果在内存中生成内存图片并封装到一个ImageIcon中 然后将ImageIcon图标作为JButton的图标进行显示

   public static Image createImageIcon(Image phantom  int size) BufferedImage bi = new BufferedImage(size  size  BufferedImage TYPE_INT_ARGB);  Graphics D g d = bi createGraphics();  g d setRenderingHint(RenderingHints KEY_ANTIALIASING  RenderingHints VALUE_ANTIALIAS_ON);  int center = size /  ;  int radius = center;  //此处进行画图  g d dispose();  return bi;

  然后 用这些Icon创建一些按钮并显示

   public static void main(String[] args) throws Exception JFrame frame = new JFrame();  frame getContentPane() setLayout(new FlowLayout());  frame getContentPane() add(new JButton( 按钮  new ImageIcon(createImageIcon(null   ))));  frame getContentPane() add(new JButton( 按钮  new ImageIcon(createImageIcon(null   ))));  frame getContentPane() add(new JButton( 按钮  new ImageIcon(createImageIcon(null   ))));  frame getContentPane() add(new JButton( 使用Java D创建的立体水晶风格的按钮  new ImageIcon(createImageIcon(null   ))));  frame setSize(   );  frame setTitle( Java也惊艳 );  frame setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);  averUtil centerWindow(frame);  frame setVisible(true);

  效果如下图

  

  本例子没有使用Look And Feel 你也可以使用JGoodies来美化一下 效果肯定更好

  五 总结

  可以看出 画出这类立体水晶效果并不难 只需仔细观察这些效果的光学细节 并用Java D的API来实现即可 这些例子稍作改进 就可以用来绘制JButton等Swing组件 并用在实际项目中 或者 也可以应用这些技巧来做一些复杂图形界面 如在aver中做出的网络拓扑图效果

  

  本文知识要点

  ■  渐变填充 这个使用GradientPaint就行了

  ■  使用Clip 类似蒙版/剪切的Java D技术 看看Graphics的setClip函数就明白了

  ■  Area的使用 主要是Area的相交 合并等几个常见图形处理手法 详细请看java awt geom Area类

  ■  生成内存图片 主要是BufferedImage类的使用

  如果大家感兴趣 可以尝试用上述Java D技巧实现下图效果

  

  六 参考资料

  l

  

cha138/Article/program/Java/hx/201311/26754

相关参考

知识大全 什么年龄的人佩戴水晶

什么年龄的人佩戴水晶什么年龄的人都可以佩戴水晶,不过要选择适合您身体、气运等五行的水晶。比如:紫水晶提高个人修养,增进事业运;绿幽灵、金发晶增加财运;粉水晶、红纹石增进异性吸引、促进家庭和睦等。还有就

知识大全 玉石与水晶有哪些区别

玉石与水晶有哪些区别水晶是一种无色透明的大型石英结晶体矿物。它的主要化学成份是二氧化硅,跟普通砂子是“同出娘胎”的一种物质。当二氧化硅结晶完美时就是水晶;二氧化硅胶化脱水后就是玛此为水晶原生矿,金发晶

家居装修选购水晶灯有几个保养常识?

家居装修选购水晶灯有几个保养常识?好的品牌水晶灯饰价格不菲,一个小小球珠都价格上百,但它特有的瑰丽绚烂仍吸引了摩登一族。专家提醒:选购水晶灯饰,“小球珠大学问”。一、水晶灯饰款式与家居风格如果选择水晶

知识大全 为什么晶天雷的水晶音箱音质那么好

为什么晶天雷的水晶音箱音质那么好?晶天雷水晶音箱的腔体是纯水晶打造的,水晶的硬度仅次于钻石,作为音箱腔体,音色几乎无损传播,高音清晰嘹亮穿透力强,中音醇厚甜美。而且水晶音箱腔体的厚度达到10-20mm

知识大全 关于水晶酒具

优质的原材料和高质量的工艺赋予了水晶酒具不寻常的光泽和透明度,同时非常的耐用。要想知道一个好的水晶酒具也要从好几方面来观看。一看选料。选料精良的水晶酒杯,应看不到星点状、云雾状和絮状分布的气液包体。质

挑选水晶灯时有几点必须注意?

挑选水晶灯时有几点必须注意?一贯雍容华贵的水晶灯现今正变得越来越娇小可人,水晶灯的大变身有赖科技的进步,随着光纤和二极管技术的发展,水晶灯的体形将变得更迷你、轻巧,更加适合现代家居风格的装修需求。随着

知识大全 水晶酒具的介绍

优质的原材料和高质量的工艺赋予了水晶酒具不寻常的光泽和透明度,同时非常的耐用。要想知道一个好的水晶酒具也要从好几方面来观看。一看选料。选料精良的水晶酒杯,应看不到星点状、云雾状和絮状分布的气液包体。质

选购水晶家居饰品有几个注意要点?

选购水晶家居饰品有几个注意要点?水晶制品和玻璃制品如果不放在一起对比,在商家灯光的效果下,很容易把玻璃制品当作水晶制品。有些商家就用一种光学玻璃,即K9玻璃来冒充水晶,看起来它也是非常透明透亮的,但它

水晶钻饰加工废水解决方案

人造水晶是由水晶树脂、甲乙酮、消色促进剂等原料混合而成的一种高分子复合材料。经化学合成的类似水晶的产品。其生产工艺是:清理模具---打蜡、涂脱模剂---组合模具---配料---浇注---成型---开模

水晶钻饰加工废水解决方案

人造水晶是由水晶树脂、甲乙酮、消色促进剂等原料混合而成的一种高分子复合材料。经化学合成的类似水晶的产品。其生产工艺是:清理模具---打蜡、涂脱模剂---组合模具---配料---浇注---成型---开模