计算Java中string的显示宽度
如何计算Java中string的长度(以像素为单位)?
最好不要使用Swing。
编辑:我想在Java2D中使用drawString()绘制string,并使用换行的长度。
如果你只是想使用AWT,然后使用Graphics.getFontMetrics
(可选地指定字体,对于非默认字体)来获取FontMetrics
,然后使用FontMetrics.stringWidth
来查找指定string的宽度。
例如,如果你有一个名为g
的Graphics
variables,你可以使用:
int width = g.getFontMetrics().stringWidth(text);
对于其他工具包,您需要向我们提供更多信息 – 它总是与工具包有关。
它并不总是需要依赖于工具包,或者并不总是需要使用FontMetrics方法,因为它需要先获得Web容器或无头环境中缺less的graphics对象。
我已经在一个web servlet中testing了它,它计算了文本的宽度。
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());
添加这些尺寸的必要值以创build任何所需的边距。
在以下类中使用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(); } }
我个人正在寻找一些东西来让我计算多行string区域,所以我可以确定给定的区域是否足够大来打印string – 保留特定的字体。
我希望这会安全一些时间给另一个可能想在java中做类似工作的人,所以想分享一下这个解决scheme:
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; }