1

我有:

Font[] fonts = 
   java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();

然后我想用自定义渲染器在 JComboBox 中渲染,但是我发现有些字体根本不渲染,或者只是看起来很糟糕。有些在 JComboBox 中也有 100-200 像素的高度,一些我完全不熟悉的奇怪字体。因此,例如,第 4 项不可读,而第 5 项(选定的蓝色项)很大,即使向下滚动也不会显示任何字符。

在此处输入图像描述

我试图删除有问题的字体,但除了不理想的白名单之外,我找不到其他方法。

我发现的最好的文章是:

但第二个实际上只是如何检查特定字符而不是整体渲染效果不佳。

我也尝试过getAvailableFontFamilyNames(),虽然这减少了列表,但 JComboBox 中仍然出现了几个渲染不良的字体。严重渲染是指高度不可见。所以尝试canDisplay('a')或类似的东西也不起作用,因为它仍然返回 true;

4

2 回答 2

2

没有“看起来很糟糕”的度量标准,但是您可以将所需的字符串绘制到某个屏幕外缓冲区中,然后查看每个字体下字符串“占用”的矩形大小。

请参阅此处了解如何操作。

通过这种方式,您可以使用所有字体渲染相同的字符串,并剔除那些产生太小或太大“矩形”的字符串 - 这应该消除所有那些当前弄乱您的用户界面的字体。

于 2013-07-05T04:55:39.597 回答
0

我最终使用的解决方案结合了 radai 所做的,但也添加了canDisplay('a'),所以我最终得到:

private boolean isAcceptableFont(Font font)
{
    int fontHeight = getFontMetrics(font).getHeight(); 
    if(fontHeight > MAX_FONT_HEIGHT || fontHeight < MIN_FONT_HEIGHT)
        return false;

    if(getFontMetrics(font).stringWidth(TEST_STRING_FOR_FONT_WIDTH) <= MIN_FONT_WIDTH)
        return false;

    if(!font.canDisplay('a'))
        return false;

    return true;
}

检查渲染字体的大小删除了很多不好的字体,但仍然有一些渲染非常糟糕。添加检查以查看它们是否至少可以显示字符“a”似乎已经过滤了剩余的不良字体。

这并不理想,但它过滤了 99% 以上没有意义的字体。

于 2013-07-07T00:03:11.007 回答