获得JEditorPane中角色的绝对位置

时间:2017-01-12 15:32:04

标签: java swing fonts jeditorpane baseline

1
我需要charater的绝对位置。用:
editorPane.getFontMetrics(f).getAscent() 我只得到与基线的相对距离。也许有办法获得基线的绝对位置?

编辑: 这是rect.y + rect.height - metrics.getDescent() - metrics.getAscent()

的结果

2 个答案:

答案 0 :(得分:0)

由于一行中的所有字体共享基线 * ,您可以通过调用modelToView并从矩形的底部减去下降和上升来计算角色的视觉位置。

由于涉及多种字体,显然JEditorPane的getFont方法是不够的。文档的原始元素属性也不够,因为HTMLDocument的属性仅仅是为HTML元素本身建模。但是,可以从相应的View

获取任何文档位置的实际字体
static Point getLocation(int pos,
                         JEditorPane editorPane)
throws BadLocationException {

    HTMLDocument doc = (HTMLDocument) editorPane.getDocument();

    View view = editorPane.getUI().getRootView(editorPane);
    int index;
    while ((index = view.getViewIndex(pos, Position.Bias.Backward)) >= 0) {
        view = view.getView(index);
    }

    AttributeSet attr = doc.getStyleSheet().getViewAttributes(view);
    Font f = doc.getStyleSheet().getFont(attr);

    FontMetrics metrics = editorPane.getFontMetrics(f);
    Rectangle rect = editorPane.modelToView(pos);

    return new Point(rect.x,
        rect.y + rect.height - metrics.getDescent() - metrics.getAscent());
}

*为简单起见,我忽略了悬挂基线和垂直基线的字符。

编辑:由于很少使用RTFEditorKit,我错误地认为您使用的是HTMLEditorKit。这适用于RTF文档:

static Point getLocation(int pos,
                     JEditorPane editorPane)
throws BadLocationException {
    StyledDocument doc = (StyledDocument) editorPane.getDocument();
    View view = editorPane.getUI().getRootView(editorPane);
    int index;
    while ((index = view.getViewIndex(pos, Position.Bias.Backward)) >= 0) {
        view = view.getView(index);
    }

    AttributeSet attr = view.getAttributes();
    Font f = doc.getFont(attr);

    FontMetrics metrics = editorPane.getFontMetrics(f);
    Rectangle rect = editorPane.modelToView(pos);

    return new Point(rect.x,
        rect.y + rect.height - metrics.getDescent() - metrics.getAscent());
}

答案 1 :(得分:0)

我正在使用RTFEditorKit。所以我改变了代码:

static Point getLocation(int pos,
            JEditorPane editorPane)
            throws BadLocationException {

        View view = editorPane.getUI().getRootView(editorPane);
        int index;
        while ((index = view.getViewIndex(pos, Position.Bias.Backward)) >= 0) {
            view = view.getView(index);
        }

        AttributeSet set = view.getAttributes();
        if (set != null && set.getAttribute(StyleConstants.FontFamily) != null) {
            Font f = new Font((String) set.getAttribute(StyleConstants.FontFamily), Font.PLAIN, (Integer) set.getAttribute(StyleConstants.FontSize));
            FontMetrics metrics = editorPane.getFontMetrics(f);

            Rectangle rect = editorPane.modelToView(pos);
            return new Point(rect.x,
                    rect.y + rect.height - metrics.getDescent() - metrics.getAscent());
        }
        else {
            return new Point(0, 0);
        }
    }

但我总是得到当前Font的上升而不是最大Font的上升。