13

有没有一种方法可以计算字符串的长度(以像素为单位),给定某个java.awt.Font对象,不使用任何 GUI 组件?

4

4 回答 4

10

不使用任何 GUI 组件?

这取决于你在这里的意思。我假设你的意思是你想在没有收到HeadlessException.

最好的方法是使用BufferedImage. AFAIK,这不会抛出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并为您提供字体大小信息。

于 2012-11-12T14:49:54.720 回答
3

您可以使用该Graphics2D对象来获取字体边界(包括宽度):

Graphics2D g2d = ...
Font font = ...
Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext());

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

于 2012-11-12T14:47:13.450 回答
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() + ")"); 
于 2012-11-12T15:12:24.057 回答
0

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

于 2021-03-14T05:56:38.380 回答