在没有使用任何GUI组件的情况下,有没有办法以给定某个java.awt.Font
对象计算字符串的长度(以像素为单位)?
答案 0 :(得分: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
并为您提供字体大小信息。
答案 1 :(得分:3)
您可以使用Graphics2D
对象获取字体范围(包括宽度):
Graphics2D g2d = ...
Font font = ...
Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext());
但这取决于您获取Graphics2D
对象的方式(例如来自Image
)。
答案 2 :(得分: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() + ")");
答案 3 :(得分:0)
我需要在调用paintComponent 之前获取字符串的长度和宽度,以便我可以将封闭面板的大小调整为文本尺寸。这些技术都没有提供足够的宽度,而且我没有可用的 Graphics 对象。我通过将字体设置为“等宽”解决了这个问题。