【问题标题】:How does one load a logical fonts physical font? (Making a JComboBox font chooser)如何加载逻辑字体物理字体? (制作一个 JComboBox 字体选择器)
【发布时间】:2011-05-14 13:16:32
【问题描述】:

这个问题的后续问题: Swing font names do not match? (Making a font chooser, and am trying to display the default system font in a JComboBox)

似乎有逻辑和物理字体。逻辑字体是: Serif、SansSerif、Monospaced、Dialog 和 DialogInput。

这些字体是动态的,它们各自的物理字体(它们在程序执行期间所代表的字体)是在程序加载时决定的。

我需要访问这些逻辑字体的物理字体。

我的第一个想法是尝试加载这些文件: http://download.oracle.com/javase/6/docs/technotes/guides/intl/fontconfig.html#loading

通过使用这样的东西: http://www.rgagnon.com/javadetails/java-0434.html

public static Properties load(String propsName) throws Exception {
    Properties props = new Properties();
    URL url = ClassLoader.getSystemResource(propsName);
    props.load(url.openStream());
    return props;
}

然后从这些属性文件中获取物理字体。

但是,当我尝试使用第一个文件中的名称加载属性时,我只是得到 NullPointerExceptions(没有找到它们,但我已经检查并实际上在我的系统上找到了它们)。我不知道我为什么会得到这个,但不管怎样,我不禁想到必须有更简单的方法来做到这一点?

【问题讨论】:

    标签: java swing fonts load classloader


    【解决方案1】:
    public static Font getPhysicalFont(Font logicalFont) {
        for (int i=0; i<FontManager.getRegisteredFonts().length; i++) {
            Font2D font = FontManager.getRegisteredFonts()[i];
            if (font instanceof CompositeFont && font.getFontName(Locale.getDefault()).equals(logicalFont.getFontName())) {
                PhysicalFont physicalFont = ((CompositeFont) font).getSlotFont(0);
                return new Font(physicalFont.getFamilyName(Locale.getDefault()), physicalFont.getStyle(), logicalFont.getSize());
            }
        }
        return logicalFont;
    }
    

    【讨论】:

    • 谢谢!我在某处听说过通常不应该使用这些类(它们是 java API 的内部),但它工作得很好 =)
    • 对于较新的 Java 版本,您可以使用: Font2D font = FontManagerFactory.getInstance().findFont2D(logicalFont.getName(), 0, FontManager.NO_FALLBACK );
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2016-03-13
    • 2012-05-03
    • 2011-12-19
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多