题
如何计算Java中字符串的长度(以像素为单位)?
不使用Swing优先。
编辑: 我想在Java2D中使用drawString()绘制字符串 并使用自动换行的长度。
解决方案
如果您只想使用AWT,请使用 Graphics.getFontMetrics
(可选择指定字体,非默认字体)获取 FontMetrics
然后 FontMetrics.stringWidth
找到指定字符串的宽度。
例如,如果你有一个名为 g
的 Graphics
变量,你可以使用:
int width = g.getFontMetrics().stringWidth(text);
对于其他工具包,您需要向我们提供更多信息 - 它始终与工具包有关。
其他提示
它并不总是需要依赖于工具包,或者并不总是需要使用FontMetrics方法,因为它需要首先获得在Web容器或无头环境中不存在的图形对象。
我在Web servlet中对此进行了测试,它确实计算了文本宽度。
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
...
String text = "Hello World";
AffineTransform affinetransform = new AffineTransform();
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
Font font = new Font("Tahoma", Font.PLAIN, 12);
int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
int textheight = (int)(font.getStringBounds(text, frc).getHeight());
为这些尺寸添加必要的值以创建任何所需的边距。
使用以下类中的getWidth方法:
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
class StringMetrics {
Font font;
FontRenderContext context;
public StringMetrics(Graphics2D g2) {
font = g2.getFont();
context = g2.getFontRenderContext();
}
Rectangle2D getBounds(String message) {
return font.getStringBounds(message, context);
}
double getWidth(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getWidth();
}
double getHeight(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getHeight();
}
}
我个人正在寻找让我计算多行字符串区域的东西,所以我可以确定给定区域是否足够大以打印字符串 - 保留特定字体。
我希望能有一段时间让另一个想在java中做类似工作的人安全一点,所以只想分享解决方案:
private static Hashtable hash = new Hashtable();
private Font font;
private LineBreakMeasurer lineBreakMeasurer;
private int start, end;
public PixelLengthCheck(Font font) {
this.font = font;
}
public boolean tryIfStringFits(String textToMeasure, Dimension areaToFit) {
AttributedString attributedString = new AttributedString(textToMeasure, hash);
attributedString.addAttribute(TextAttribute.FONT, font);
AttributedCharacterIterator attributedCharacterIterator =
attributedString.getIterator();
start = attributedCharacterIterator.getBeginIndex();
end = attributedCharacterIterator.getEndIndex();
lineBreakMeasurer = new LineBreakMeasurer(attributedCharacterIterator,
new FontRenderContext(null, false, false));
float width = (float) areaToFit.width;
float height = 0;
lineBreakMeasurer.setPosition(start);
while (lineBreakMeasurer.getPosition() < end) {
TextLayout textLayout = lineBreakMeasurer.nextLayout(width);
height += textLayout.getAscent();
height += textLayout.getDescent() + textLayout.getLeading();
}
boolean res = height <= areaToFit.getHeight();
return res;
}
不隶属于 StackOverflow