与JTextPane关联的StyledDocument的字体

时间:2011-08-04 22:02:26

标签: java swing jtextpane styleddocument

与JTextPane关联的StyledDocument使用什么字体?默认情况下,它是否使用与JTextPane相同的字体?特别是,我想知道字体大小。

2 个答案:

答案 0 :(得分:3)

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;
}

答案 1 :(得分:2)

相关的UIManager密钥为TextPane.fontUIManager.get()可用于确定所选L& F的值。例如,在Mac OS X上,此代码生成以下控制台输出:

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

控制台:

com.apple.laf.AquaFonts$DerivedUIResourceFont[
    family=Lucida Grande,name=Lucida Grande,style=plain,size=13]

附录:如此example所示,默认值为StyleContext.NamedStyle,与UI默认值匹配:

NamedStyle:default {
    name=default,font-style=,
    FONT_ATTRIBUTE_KEY=com.apple.laf.AquaFonts$DerivedUIResourceFont[
        family=Lucida Grande,name=Lucida Grande,style=plain,size=13],
    font-weight=normal,
    font-family=Lucida Grande,
    font-size=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());
}