有比获取FontMetrics实例更友好的方法吗?
FontMetrics fm = Graphics.getFontMetrics(Font);我讨厌这种方式,因为下面的例子:
如果你想在游戏中创建一个菜单,并且你想要所有的菜单项都在屏幕的中央,你需要字体度量。但是,大多数情况下,菜单项是可点击的。因此,我创建了一个Rectangles数组,所有的矩形都适合这些项的周围,所以当按下鼠标时,我可以简单地使用
for (int i = 0; i < rects.length; i++)
if (rects[i].contains(mouseX, mouseY)) { ... }但是为了创建矩形,我还需要FontMetrics作为它们的坐标。这意味着我必须在菜单的paint-method中构建所有的矩形。
所以我想要一种获取FontMetrics的方法,这样我就可以在构造函数调用的方法中构造矩形。
发布于 2013-02-06 21:04:23
真正正确的答案是使用Toolkit。
Font font = new Font("Courier New", Font.PLAIN, 14);
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);发布于 2013-08-09 21:48:07
对我来说,最简单的方法是:
Font font = new Font("Helvetica",Font.PLAIN,12);
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);好处:
现在你可以很容易的得到高度和宽度。
发布于 2010-05-02 21:19:51
一旦背景组件,即你的菜单后面的任何东西被渲染,它就有一个Graphics对象,你可以用它来获取给定字体的度量,只需一次。
您肯定不希望在paint方法中执行此操作,该方法应该尽可能轻量级。我会将这段代码挂在一个侦听器上,该侦听器在组件首次呈现时被调用。它可以将生成的FontMetrics对象存储在以后可以访问的某个位置,或者存储在用于绘制这些菜单项框的paint方法中。
与其在最后时刻确定菜单图形的测量值,也就是在执行paint时,创建一些组件来表示菜单可能是个好主意。您可以将这些组件放在玻璃面板more info here上,这样它们就会浮动在所有其他组件之上,而且您还可以获得额外的好处,即这些组件都能够接受鼠标单击并在其上触发侦听器事件,而且由于它们只捕获自己几何体上的事件,因此您甚至不必确定单击命中了菜单的哪个部分。
在这里使用组件的另一个好处是,您可以完全绕过摆弄字体度量的要求。有现成的菜单项,或者您可以只使用JLabels,您可以指定它们的对齐方式,您可以使用LayoutManager将框的大小调整为最大标签的宽度,等等。
https://stackoverflow.com/questions/2753514
复制相似问题