Шрифт StyledDocument, связанный с JTextPane

Какой шрифт использует StyledDocument, связанный с JTextPane? По умолчанию он использует тот же шрифт, что и JTextPane? В частности, меня интересует размер шрифта.

2 ответа

Решение

StyledDocument - это просто интерфейс. Интерфейс не имеет шрифта.

Если вы посмотрите на класс DefaultStyledDocument (реализующий интерфейс).

public Font getFont(AttributeSet attr) {
    StyleContext styles = (StyleContext) getAttributeContext();
    return styles.getFont(attr);
}

Затем в источниках StyleContext

public Font getFont(AttributeSet attr) {
    // PENDING(prinz) add cache behavior
    int style = Font.PLAIN;
    if (StyleConstants.isBold(attr)) {
        style |= Font.BOLD;
    }
    if (StyleConstants.isItalic(attr)) {
        style |= Font.ITALIC;
    }
    String family = StyleConstants.getFontFamily(attr);
    int size = StyleConstants.getFontSize(attr);

    /**
     * if either superscript or subscript is
     * is set, we need to reduce the font size
     * by 2.
     */
    if (StyleConstants.isSuperscript(attr) ||
        StyleConstants.isSubscript(attr)) {
        size -= 2;
    }

    return getFont(family, style, size);
}

Тогда в StyleConstants.

public static int getFontSize(AttributeSet a) {
    Integer size = (Integer) a.getAttribute(FontSize);
    if (size != null) {
        return size.intValue();
    }
    return 12;
}

Подходящий UIManager ключ TextPane.font, UIManager.get() может использоваться для определения значения для выбранного L&F. Например, в Mac OS X этот код создает следующий вывод консоли:

System.out.println(UIManager.get("TextPane.font"));

Приставка:

com.apple.laf.AquaFonts $ DerivedUIResourceFont [
    семья =Lucida Grande, имя =Lucida Grande, стиль = обычный, размер =13]

Приложение: Как показано в этом примере, по умолчанию StyleContext.NamedStyle это соответствует пользовательскому интерфейсу по умолчанию:

NamedStyle: default {
    имя = по умолчанию, стиль шрифта =,
    FONT_ATTRIBUTE_KEY=com.apple.laf.AquaFonts$DerivedUIResourceFont[
        семья =Lucida Grande, имя =Lucida Grande, стиль = обычный, размер =13],
    начертание шрифта = нормальное,
    font-family=Lucida Grande,
    размер шрифта =4,
}

Приложение: Вот код для перебора стилей панели:

JTextPane jtp = new JTextPane();
...
HTMLDocument doc = (HTMLDocument) jtp.getDocument();
StyleSheet styles = doc.getStyleSheet();
Enumeration rules = styles.getStyleNames();
while (rules.hasMoreElements()) {
    String name = (String) rules.nextElement();
    Style rule = styles.getStyle(name);
    System.out.println(rule.toString());
}
Другие вопросы по тегам