我有:
Font[] fonts =
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
然后我想在一个带有自定义渲染器的JComboBox中渲染,但是我发现某些字体根本不渲染,或者只是看起来非常糟糕。有些人在JComboBox中也有100-200像素的高度,有些奇怪的字体我并不熟悉。因此,例如第4项是不可读的,第5项(蓝色中选定的项目)很大,即使向下滚动也不显示任何字符。
我试图删除有问题的字体,但除了白名单之外我找不到办法,这是不理想的。
我找到的最好的文章是:
但第二个实际上就是如何检查特定角色而不是整体渲染效果不佳。
我也试过getAvailableFontFamilyNames()
,尽管这会减少列表,但JComboBox中仍会出现几个渲染严重的字体。通过严重渲染我的意思是看不见高度吨。所以尝试canDisplay('a')
或类似的东西也行不通,因为它仍然返回true;
答案 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%以上没有意义的字体。