有没有一种方法,可以在不使用任何GUI组件的情况下,根据给定的java.awt.Font
对象计算字符串的像素长度?
有没有一种方法,可以在不使用任何GUI组件的情况下,根据给定的java.awt.Font
对象计算字符串的像素长度?
这是不使用任何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并提供字体大小信息。
Graphics2D
对象来获取字体范围(包括宽度):Graphics2D g2d = ...
Font font = ...
Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext());
但这取决于您如何获取 Graphics2D
对象(例如从一个 Image
中)。
Image
不是 GUI 组件。 - dacweGraphics2D
可能是从类似于img.getGraphics()
(或者更确切地说是img.createGraphics()
)这样的东西中获取的。 - Andrew Thompson这对我来说的输出是(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() + ")");
在调用paintComponent之前,我需要获取字符串的长度和宽度,以便将封闭面板大小设置为文本维度。这些技术都没有提供足够的宽度,并且我没有可用的Graphics对象。通过将字体设置为“Monospaced”,我解决了这个问题。
GlyphVector
来实现。它将最终图像放在GUI中,但那只是为了显示它。 - Andrew Thompson