一序言
关于Java做不好桌面的争论已经由来已久虽然Swing和JavaD已经有超过十年的历史也有JIDEJGoodiesTWaver等不少开源Swing组件但是用Java做桌面程序仍然不是一件轻松的事本《Java也惊艳》系列文章就是想通过一些简单生动的例子和大家一起认识Java探索Swing其实你只需要多一点创意多一点耐心你的Java程序也可以惊艳!本文就带您一起进入Java的惊艳之旅
二立体套管效果
在网络通讯中经常要表达协议之间的承载关系例如IP协议作为高层协议可以承载在SDH上也可以承载在ATM协议上同样IP作为协议还可以承载更多的高层协议例如Voice over IP甚至电信中Everything over IP的概念在表现上用相互嵌套的立体套管来表现协议的承载是再合适不过了(如下图)
具体实现很简单主要代码如下
importjavaawt*;
importjavaawtgeom*;
importjavaxswing*;
importtwaver*;
publicclassPipleComponentextendsJComponent{
publicvoidpaint(Graphicsg){
GraphicsDgd=(GraphicsD)g;
gdsetRenderingHint(RenderingHintsKEY_ANTIALIASINGRenderingHintsVALUE_ANTIALIAS_ON);
ShapeparentHollowShape=createPiple(gdTWaverUtilgetRandomColor()null);
createPiple(gdTWaverUtilgetRandomColor()parentHollowShape);
createPiple(gdTWaverUtilgetRandomColor()parentHollowShape);
createPiple(gdTWaverUtilgetRandomColor()parentHollowShape);
createPiple(gdTWaverUtilgetRandomColor()parentHollowShape);
}
privateShapecreatePiple(GraphicsDgdintxintyintwidthintheightColorcolorShapeparentHollowShape){
if(parentHollowShape!=null){
Rectanglebounds=parentHollowShapegetBounds();
RectanglerightClip=newRectangle(boundsx+boundswidth/boundsyboundsheight);
Areaclip=newArea(parentHollowShape);
clipadd(newArea(rightClip));
gdsetClip(clip);
}
intcircleWidth=height/;
GradientPaintpaint=newGradientPaint(x
y
colorbrighter()
x
y+(int)(height*)
colordarker()
true);
gdsetPaint(paint);
EllipseDDoubleleftCircle=newEllipseDDouble(xcircleWidth/ycircleWidthheight);
EllipseDDoublerightCircle=newEllipseDDouble(x+widthcircleWidth/ycircleWidthheight);
intthickness=;
EllipseDDoublerightHollowCircle=newEllipseDDouble(rightCirclegetX()+thickness
rightCirclegetY()+thickness
rightCirclegetWidth()thickness*
rightCirclegetHeight()thickness*);
Rectanglerect=newRectangle(xywidthheight);
Areaarea=newArea(leftCircle);
areaadd(newArea(rect));
areasubtract(newArea(rightCircle));
gdfill(area);
gdsetColor(colordarker());
gdfill(rightCircle);
paint=newGradientPaint(x
y
ColordarkGray
x
y+(int)(height*)
ColorlightGray
true);
gdsetPaint(paint);
gdfill(rightHollowCircle);
gdsetClip(null);
returnrightHollowCircle;
}
publicstaticvoidmain(String[]args){
JFrameframe=newJFrame();
framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
framesetSize();
frameadd(newPipleComponent());
framesetVisible(true);
}
}
三总结
本文知识要点
渐变填充创建GradientPaint并设置亮暗亮的填充模式
使用Clip类似蒙版/剪切的JavaD技术看看Graphics的setClip函数即可
Area的使用主要是Area的相交合并等几个常见图形处理手法详细请看javaawtgeomArea类
使用随机色这个就太简单了如果有twaverjar可以直接使用TWaverUtilgetRandomColor()如果没有就直接new Color就行了注意使用第四个int参数增加Alpha透明度的变化
如果大家感兴趣可以尝试用上述JavaD技巧实现下图效果
六参考资料
l
~hall/java/l