一、序言
关于“Java做不好桌面”的争论已经由来已久。虽然Swing和Java2D已经有超过十年的历史,也有JIDE、JGoodies、TWaver等不少开源Swing组件,但是用Java做桌面程序仍然不是一件轻松的事。本《Java也惊艳》系列文章,就是想通过一些简单生动的例子,和大家一起认识Java、探索Swing.其实你只需要多一点创意、多一点耐心,你的Java程序也可以“惊艳”!本文就带您一起进入Java的“水晶之恋”。
二、立体水晶效果
受苹果公司的影响,现在立体水晶风格的界面非常流行。Java也可以吗?我们不妨先尝试一下用Java绘制一个立体水晶风格的按钮到底有多难。一个立体的水晶按钮应当有一个图标、一个圆角矩形区域、边框以及一些立体反光效果,如下图:
简单思路如下:先画矩形区域,然后画图标,然后设置clip并画高亮反光区域,最后画外部边框。
具体实现比较简单,主要代码如下:
Color color
=
TWaverUtil.getRandomColor();
RoundRectangle2D body
=
new
RoundRectangle2D.Float(x, y, size, size, size
/
3
, size
/
3
);
//
draw body
g2d.setColor(color);
GradientPaint paint
=
new
GradientPaint(x,
y,
color.darker(),
x,
y
+
size,
color.brighter().brighter());
g2d.setPaint(paint);
g2d.fill(body);
//
draw image
g2d.setClip(body);
Image image
=
TWaverUtil.getImage(
"
/glass/
"
+
i
+
"
.png
"
);
g2d.drawImage(image,
x
+
(size
-
image.getWidth(
null
))
/
2
,
y
+
(size
-
image.getHeight(
null
))
/
2
,
null
);
g2d.setClip(
null
);
//
draw highlight.
Shape highlightArea
=
createHighlightShape(x, y, size, body);
g2d.setColor(
new
Color(
255
,
255
,
255
,
150
));
g2d.fill(highlightArea);
//
draw outline.
g2d.setColor(color.darkGray);
g2d.draw(body);
其中,对高亮区域的计算,可以用一个圆心在左上方的大圆形和矩形进行剪切:
private
static
Shape createHighlightShape(
int
centerX,
int
centerY,
int
size, Shape body) {
double
myRadius
=
size
*
4
;
double
x
=
centerX
-
size
*
2.3
;
double
y
=
centerY
-
size
*
3.2
;
Ellipse2D.Double circle
=
new
Ellipse2D.Double(x, y, myRadius, myRadius);
Area area
=
new
Area(circle);
area.intersect(
new
Area(body));
return
area;
}
运行程序效果如下: