我需要charater的绝对位置。用:
editorPane.getFontMetrics(f).getAscent()
我只得到与基线的相对距离。也许有办法获得基线的绝对位置?
编辑: 这是rect.y + rect.height - metrics.getDescent() - metrics.getAscent()
的结果答案 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的上升。