【发布时间】:2012-09-18 21:21:39
【问题描述】:
我的 JPanel 中有一个区域,以点 (0,0) 和 (width,height) 为界。这是一个正方形。
我有话说
String s;
我想找到s 可以使用的最大字体大小。现在,我知道有一种方法可以使用 FontMetrics 并制作一个 for 循环来不断增加字体的大小,直到它不适合该区域。但这太低效了,必须有一种方法来计算给定字体类型的字体大小,例如适合该区域的“Courier”。
BAD方式示例:
Font f = new Font("Courier", Font.PLAIN, 1);
FontMetrics fm = this.getFontMetrics(f); //this is a JPanel
do {
f = new Font("Courier", Font.PLAIN, f.getSize()+1);
fm = this.getFontMetrics(f);
while(fm.stringWidth(s) < width && fm.getHeight() < height);
【问题讨论】:
-
对于非等宽字体,每个字符可以是不同的宽度。因此,您必须遍历字符串的长度,将每个字符的相对宽度相加,然后乘以当前字体大小的一个因子。这听起来和您已经描述的方法一样“低效”。
-
“但这太低效了” - 你需要它有多高效?我已经成功地在生产代码中实现了这种方法,每秒绘制数百个带有文本的多边形,并且运行得非常顺利 - 它是在 Java 1.4 上实现的。
-
所以你们俩本质上是说这是最好的方法吗?我只是假设会有更好的东西。
-
@CodeGuy:是的,差不多。我的意思是,您是否真的因此而经历了显着的绩效放缓?如果没有,我不会费心去优化它。从理论上讲,您可以使用稍微好一点的算法来加快速度,但这不值得。比较掉蛋问题:classic-puzzles.blogspot.com/2006/12/…
标签: java jpanel fontmetrics