2008-11-03 150 views
72

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

不用Swing就可以。

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

+4

没有摇摆?你使用什么设备?什么字体?什么尺寸?什么风格?所有这些都会改变显示宽度。 – 2008-11-03 12:31:56

+1

@S。洛特。你有一个。我很想把它作为一个非问题来解决。 – 2008-11-03 12:34:01

+1

@David Arno:我是n00bz的一员。我将添加[新手]标记。 – 2008-11-03 12:39:01

回答

108

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

举例来说,如果你有一个Graphics变量叫g,你会使用:

int width = g.getFontMetrics().stringWidth(text); 

对于其他工具包,你需要给我们更多的信息 - 它总是要工具包依赖。

38

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

添加必要的值这些尺寸创建任何所需的保证金。

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(); 
    } 

} 
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; 
}