【问题标题】:Java Get Size of FontJava 获取字体大小
【发布时间】:2017-10-05 19:44:58
【问题描述】:

我有JFrame,里面有一个JTextArea

Font font = new Font("monospaced", Font.PLAIN, 14);
textarea.setFont(font);

由于字体是等宽字体,所有字符的宽度和高度都相同。

我想知道这个宽度和高度是多少,以像素为单位。

为此,我可以使用font.getStringBounds,但我没有Graphics 上下文可以传递给它。 frame.getGraphics() 返回null

如何找到字符的大小?可以在没有Graphics 实例的情况下完成吗?无论如何,我不想要它的实例。我只想知道我的角色有多大。

【问题讨论】:

  • 您的问题不清楚,您能否提供更多信息与代码的空部分。
  • 字体“大小”将基于渲染目标的上下文。一般来说,你想看看Graphics#getFontMetrics 或一些这样的相关方法。如果您没有可用的Graphics 上下文,您可以创建一个BufferedImage 并使用它。那么问题就变成了,你为什么想要这些信息?
  • @MadProgrammer 谢谢你-我会调查BufferedImage。仅供参考,我正在使用JFrame/JTextarea 来渲染基于文本的游戏,因此我将使用此信息来缩放文本并以字符为单位获取窗口的尺寸。
  • @SamDev JFrame#getGraphics() 是返回null 的方法。我在实例化 JFrame 后立即执行此操作。

标签: java swing fonts jpanel jtextarea


【解决方案1】:

您可以使用JFrame#getFontMetrics,因为JFrame 的超类之一是Component

如果这样不行,你也可以使用BufferedImage来获取Graphics对象:

BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);

您可以使用image 对象来获取Graphics 的实例。

【讨论】:

  • 不,我说的是 JFrame#getFontMetrics 而不是 Graphics#getFontMetrics
  • 我还添加了另一种获取 Graphics 对象的方法,因为您认为我的回答是错误的
  • 虽然技术上正确,但根据 OP 正在尝试做的事情,它可能不是最好的解决方案
  • @MadProgrammer JFrame#getFontMetrics 确实有效。我已提交编辑以删除其余答案,因为它确实应该放在单独的答案中。
  • 拒绝,因为有人有一个自定义组件在某些情况下不支持 getFontMetrics
【解决方案2】:

仅供参考,我正在使用 JFrame/JTextarea 来渲染基于文本的游戏,因此我将使用此信息来缩放文本并以字符为单位获取窗口的尺寸

这可能不是最好的方法,最好简单地使用JTextArea#setColumnsJTextArea#setRows,这将使用基于字体的信息来自动确定它的首选大小

然后您可以使用LayoutManager API 并简单地在JFrame 上调用pack,它将根据其首选大小将窗口打包在内容周围

这也会影响JScrollPane的首选大小

【讨论】:

  • 啊哈,我尝试过使用 setRows 和 setCols 但不幸的是它们没有效果。
  • “我尝试过使用 setRows 和 setCols,但不幸的是它们没有效果” 然后还有其他问题,应该调查和解决。
  • @Lolums 我之前已经多次使用过这种技术,并且效果很好,正如 Andrew 所说,如果它不起作用,可能是因为你正在做其他事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2015-06-19
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多