知识大全 水晶之恋

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

相关参考