Java中字符串像素长度

13

有没有一种方法,可以在不使用任何GUI组件的情况下,根据给定的java.awt.Font对象计算字符串的像素长度?


请参考此答案,使用GlyphVector来实现。它将最终图像放在GUI中,但那只是为了显示它。 - Andrew Thompson
4个回答

10

这是不使用任何GUI组件的吗?

这要看你的意思是什么。我假设你的意思是想要避免收到HeadlessException异常。

最好的方法是使用BufferedImage。据我所知,这不会引发HeadlessException异常:

Font font = ... ;
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
FontMetrics fm = img.getGraphics().getFontMetrics(font);
int width = fm.stringWidth("Your string");

除此以外,我认为你不能使用其他方法。你需要一个图形上下文来创建FontMetrics并提供字体大小信息。


3
您可以使用 Graphics2D 对象来获取字体范围(包括宽度):
Graphics2D g2d = ...
Font font = ...
Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext());

但这取决于您如何获取 Graphics2D 对象(例如从一个 Image 中)。


我认为这算作GUI组件。 - Link19
@GlenLamb 我不同意,Image 不是 GUI 组件。 - dacwe
我同意,但是不使用图形用户界面组件的特定需求通常会涉及到awt,否则这个要求就没有多大意义了。 - Link19
@GlenLamb 我不明白你的意思。在Brian的代码中,Graphics2D可能是从类似于img.getGraphics()(或者更确切地说是img.createGraphics())这样的东西中获取的。 - Andrew Thompson
@dacwe为什么要指定“不使用GUI组件”,除非需要避免使用awt Graphics2d?因为这几乎是你无论是否使用GUI都会这样做的方式。 - Link19

2

这对我来说的输出是(137.0,15.09375)。我不知道单位是什么,但它看起来比例正确,并且没有直接使用Graphics2D。

    Font f = new Font("Ariel", Font.PLAIN, 12);
    Rectangle2D r = f.getStringBounds("Hello World! Hello World!", new FontRenderContext(null, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT));
    System.out.println("(" + r.getWidth() + ", " + r.getHeight() + ")"); 

0

在调用paintComponent之前,我需要获取字符串的长度和宽度,以便将封闭面板大小设置为文本维度。这些技术都没有提供足够的宽度,并且我没有可用的Graphics对象。通过将字体设置为“Monospaced”,我解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接