java - 如何加载逻辑字体物理字体? (制作 JComboBox 字体选择器)

标签 java swing fonts load classloader

这一个的后续问题: 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(它们没有找到,但我已经检查过,实际上在我的系统上找到了它们)。我不知道为什么我会得到这个,但无论如何,我不禁认为一定有更简单的方法来做到这一点?

最佳答案

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 - 如何加载逻辑字体物理字体? (制作 JComboBox 字体选择器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002051/

相关文章:

java - Tomcat 7 javax.el.E​​LException 异常

java - 如何使计时器倒计时以及进度条?

java - 如何在 Java 中创建屏幕键盘?

java - 当文本从右到左时确定 JTextArea 的区域中存在什么文本

Android - 字体(只有字母)背景颜色

html - 将本地作品移动到服务器时出现字体问题

java - 执行外部命令并从 Jython 2.1 读取 stderr/stdout

java - 分离Mysql的读写,无需修改Web服务器的配置

java - 在字符串中给定单词之后获取子字符串的最佳方法?

c# - 启用字体/图标缩放时图形 CopyFromScreen 关闭