Как загрузить физический шрифт логических шрифтов? (Создание выбора шрифта JComboBox) - PullRequest
2 голосов
/ 14 мая 2011

Дополнительный вопрос от этого: Имена шрифтов Swing не совпадают?(Выбор шрифта, и я пытаюсь отобразить системный шрифт по умолчанию в 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 при попытке загрузить свойства, используя имена в первом файле (они не найдены, но я проверил и действительно нашел их в моей системе).Я не знаю, почему я получаю это, но независимо от этого, я не могу не думать, что должен быть более простой способ сделать это?

1 Ответ

4 голосов
/ 14 мая 2011
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;
}
...