Java - 如何判断哪些字体不呈现?

时间:2013-07-05 04:45:50

标签: java swing fonts awt jcombobox

我有:

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

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

enter image description here

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

我找到的最好的文章是:

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

我也试过getAvailableFontFamilyNames(),尽管这会减少列表,但JComboBox中仍会出现几个渲染严重的字体。通过严重渲染我的意思是看不见高度吨。所以尝试canDisplay('a')或类似的东西也行不通,因为它仍然返回true;

2 个答案:

答案 0 :(得分:2)

没有“看起来很糟糕”的指标,但你可以将你想要的字符串绘制到一些屏幕外的缓冲区中,并在每种字体下看到字符串“占据”的矩形大小。

请参阅here了解如何操作。

这样你就可以用所有字体呈现相同的字符串,并抛出那些产生太小或太大的“矩形”的字符串 - 这应该消除所有那些当前弄乱你的ui的字体。

答案 1 :(得分: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%以上没有意义的字体。