Swing字体名称不匹配? (制作字体选择器,并尝试在JComboBox中显示默认系统字体)

时间:2011-05-14 10:45:37

标签: java swing graphics fonts dialog

我正在创建一个swing字体选择器。 (另见:How to prevent JComboBox from becoming unresponsive when using a custom ListCellRenderer

要获取所有可用字体,我会这样做:

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

在包含所有可用字体的字体选择器(JComboBox)中,我想初始化它,显示所选的默认系统字体。

为此,我使用静态基本字体(从静态基本标签(JLabel)获取),从中我获得默认字体。 然后,在JComboBox初始化期间,我调用

fontComboBox.setSelectedItem(new Font(baseFont.getName(),baseFont.getStyle(),1)); 
//The size is 1 in all fonts retrieved from GraphicsEnvironment.
//The combo box contains objects of the type Font.

将所选字体设置为默认系统字体。

大部分时间都可以使用。虽然看起来对于某些字体,创建的基本字体与从GraphicsEnvironment检索的任何字体都不匹配。

对我来说,基本字体是Dialog。字体名称是“Dialog”。但是,从GraphicsEnvironment for Dialog检索的字体名称是“Dialog.Bold”,“Dialog.Plain”和“Dialog.Italic”。由于创建的字体具有不同的名称,因此组合框不会选择所需的项目(等于(...)失败)。

请注意这对大多数字体是如何工作的(到目前为止我唯一测试过的字体是Dialog字体)。

有没有更好的解决方案来避免这个问题?我可以使用一些特定的其他Swing组件来获取正确的字体名称而不是JLabel来获取基本字体吗? 最后,为什么这些名字不匹配?

编辑:后续问题:How does one load a logical fonts physical font? (Making a JComboBox font chooser)

1 个答案:

答案 0 :(得分:4)

有一些字体“Dialog”,“Monospaced”和一些更不记得名字不是rel字体。人工字体由java使用,但它们使用另一种物理字体呈现。这样做是为了提供与平台无关的字体​​名称。

这意味着,例如对于“Monospaced”字体,使用一些具有相同字符'widhts的OS依赖的真实字体。 http://download.oracle.com/javase/1.3/docs/guide/intl/addingfonts.html