JavaSwing也惊艳之二:环环相套

 一、序言

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

  二、立体套管效果

  在网络通讯中,经常要表达协议之间的“承载”关系。例如,IP协议作为高层协议可以承载在SDH上,也可以承载在ATM协议上。同样,IP作为协议还可以承载更多的高层协议,例如Voice over IP,甚至电信中Everything over IP的概念。在表现上,用相互嵌套的立体套管来表现协议的“承载”是再合适不过了(如下图)。

import java.awt.*; 
 
import java.awt.geom.*; 
 
import javax.swing.*; 
 
 
import twaver.*; 
 
 
public class PipleComponent extends JComponent { 
 
 
    public void paint(Graphics g) { 
 
        Graphics2D g2d = (Graphics2D) g; 
 
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
 
        Shape parentHollowShape=createPiple(g2d,100,100,200,200,TWaverUtil.getRandomColor(),null); 
 
        createPiple(g2d,120,120,280,40,TWaverUtil.getRandomColor(),parentHollowShape); 
 
        createPiple(g2d,130,170,310,40,TWaverUtil.getRandomColor(),parentHollowShape); 
 
        createPiple(g2d,140,220,290,50,TWaverUtil.getRandomColor(),parentHollowShape); 
 
        createPiple(g2d,130,190,300,30,TWaverUtil.getRandomColor(),parentHollowShape); 
 
    } 
 
 
    private Shape createPiple(Graphics2D g2d,int x, int y, int width, int height,Color color,Shape parentHollowShape) { 
 
        if(parentHollowShape!=null){ 
 
            Rectangle bounds=parentHollowShape.getBounds(); 
 
            Rectangle rightClip=new Rectangle(bounds.x+bounds.width/2,bounds.y,3000,bounds.height); 
 
            Area clip=new Area(parentHollowShape); 
 
            clip.add(new Area(rightClip)); 
 
            g2d.setClip(clip); 
 
        } 
 
        int circleWidth = height/3; 
 
        GradientPaint paint = new GradientPaint(x, 
 
                                                y, 
 
                                                color.brighter(), 
 
                                                x, 
 
                                                y + (int) (height * 0.65), 
 
                                                color.darker(), 
 
                                                true); 
 
        g2d.setPaint(paint); 
 
        Ellipse2D.Double leftCircle = new Ellipse2D.Double(x - circleWidth / 2, y, circleWidth, height); 
 
        Ellipse2D.Double rightCircle = new Ellipse2D.Double(x + width - circleWidth / 2, y, circleWidth, height); 
 
        
 
        int thickness=4; 
 
        Ellipse2D.Double rightHollowCircle = new Ellipse2D.Double(rightCircle.getX()+thickness, 
 
            rightCircle.getY()+thickness, 
 
            rightCircle.getWidth()-thickness*2, 
 
            rightCircle.getHeight()-thickness*2); 
 
        
 
        Rectangle rect = new Rectangle(x, y, width, height); 
 
        Area area = new Area(leftCircle); 
 
        area.add(new Area(rect)); 
 
        area.subtract(new Area(rightCircle)); 
 
        g2d.fill(area); 
 
        g2d.setColor(color.darker()); 
 
        g2d.fill(rightCircle); 
 
        
 
        paint = new GradientPaint(x, 
 
                                  y, 
 
                                  Color.darkGray, 
 
                                  x, 
 
                                  y + (int) (height * 0.4), 
 
                                  Color.lightGray, 
 
                                  true); 
 
 
        g2d.setPaint(paint); 
 
        g2d.fill(rightHollowCircle); 
 
        
 
        g2d.setClip(null); 
 
        
 
        return rightHollowCircle; 
 
    } 
 
 
    public static void main(String[] args) { 
 
        JFrame frame = new JFrame(); 
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
        frame.setSize(800, 600); 
 
        frame.add(new PipleComponent()); 
 
        frame.setVisible(true); 
 
    } 
 
}


  三、总结

  本文知识要点:

   渐变填充:创建GradientPaint并设置“亮-暗-亮”的填充模式;

   使用Clip:类似蒙版/剪切的Java2D技术。看看Graphics的setClip函数即可;

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

   使用随机色:这个就太简单了,如果有twaver.jar,可以直接使用TWaverUtil.getRandomColor();如果没有,就直接new Color就行了,注意使用第四个int参数增加Alpha透明度的变化;

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

  六、参考资料

  http://java.sun.com/j2se/1.4.2/docs/guide/2d/spec/j2d-bookTOC.html

  http://java.sun.com/j2se/1.4.2/docs/guide/2d/spec.html

  http://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.html

  系列文章:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值