作者:家居猫
在编写 Java 图形程序时,大家通常是用 java.awt.Graphics.drawString( int x, int y ) 来画字符串。但是其效果往往不能满足我们的要求。
其实,Java2D提供了更先进的绘制字符串的方法,用 TextLayout 可以绘制出相当令人满足的效果。下面是一个例子供大家参考:
//设置字体
Font mFont = new Font( font, style, (int)size );
//保存当前的着色参数
RenderingHints rhs = g.getRenderingHints();
//在 Linux 画中文字符时,打开抗锯齿功能可能会影响显示效果。
//所以这里将抗锯齿功能关掉。你也可以经过测试来决定是否关闭此功能。
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
//下面这段代码测试字符串可能显示的宽度。假如宽度大于 limitWidth,则用 ... 代替多余的部分。
if (limitWidth != -1) {
AttributedString as = new AttributedString(buf);
as.addAttribute( TextAttribute.FONT, mFont );
TextMeasurer tm = new TextMeasurer(as.getIterator(), g.getFontRenderContext());
int limitIndex = tm.getLineBreakIndex(0, limitWidth);
if (buf.length() > limitIndex) {
buf = buf.substring(0, limitIndex) + "...";
}
}
//构造 TextLayout
TextLayout tl = new TextLayout(buf, mFont, g.getFontRenderContext());
//构造下面这个 TextLayout 主要是为了得到英文字符串的全高度。
//因为 "abc" 与 "obj" 所占的高度是不一样的,"j"多占了下面的一部分。
TextLayout tmptl = new TextLayout("Ig", mFont, g.getFontRenderContext());
Rectangle2D tmprt = tmptl.getBounds();
//恢复旧的着色参数
g.setRenderingHints(rhs);
//画字符串,注重这里的 x, y 坐标是 TextLayout 所占矩形框的左上角坐标。
tl.draw(g, x, (float)(y + tmprt.getHeight()));
--摘自 http://www.javaidea.net