用Java计算字符串的显示宽度

时间:2008-11-03 12:30:05

标签: java string-length

如何计算Java中字符串的长度(以像素为单位)?

不使用Swing优先。

编辑: 我想在Java2D中使用drawString()绘制字符串 并使用自动换行的长度。

5 个答案:

答案 0 :(得分:119)

如果您只想使用AWT,请使用Graphics.getFontMetrics(可选择指定字体,非默认字体)获取FontMetrics,然后FontMetrics.stringWidth查找宽度对于指定的字符串。

例如,如果您有一个名为Graphics的{​​{1}}变量,则可以使用:

g

对于其他工具包,您需要向我们提供更多信息 - 它始终与工具包有关。

答案 1 :(得分:49)

它并不总是需要依赖于工具包,或者并不总是需要使用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());

为这些尺寸添加必要的值以创建任何所需的边距。

答案 2 :(得分:7)

使用以下类中的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();
  }

}

答案 3 :(得分:1)

现在完全有所不同。以下假设字体为arial,并根据字符与宽度的线性插值进行了大胆的猜测。

// Returns the size in PICA of the string, given space is 200 and 'W' is 1000.
// see https://p2p.wrox.com/access/32197-calculate-character-widths.html

static int picaSize(String s)
{
    // the following characters are sorted by width in Arial font
    String lookup = " .:,;'^`!|jl/\\i-()JfIt[]?{}sr*a\"ce_gFzLxkP+0123456789<=>~qvy$SbduEphonTBCXY#VRKZN%GUAHD@OQ&wmMW";
    int result = 0;
    for (int i = 0; i < s.length(); ++i)
    {
        int c = lookup.indexOf(s.charAt(i));
        result += (c < 0 ? 60 : c) * 7 + 200;
    }
    return result;
}

有趣,但可能不太实用。

答案 4 :(得分:0)

我个人正在寻找让我计算多行字符串区域的东西,所以我可以确定给定区域是否足够大以打印字符串 - 保留特定字体。

我希望能有一段时间让另一个想在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;
}