Java - 获取/设置JTextPane的行高,内容类型为“text / html”

时间:2016-12-14 19:13:06

标签: java css swing jtextpane

我有JTextPane内容类型为“text / html”。它集成在JScrollPane

用户可以在此JTextPane中向下滚动并点击按钮。此时我想计算JTextPane的最顶层实际可见行!

我在另一篇文章中找到了这些行:

public Integer getActualDisplayedRows() {
    int y1 = jtextpane.getVisibleRect().y;
    int lineHeight = jtextpane.getFontMetrics(jtextpane.getFont()).getHeight();
    int topMostRow = (int) Math.ceil((double) y1 / lineHeight);
    return topMostRow;
}

但这不算正确.. lineHeight中的数字太小了。所以,如果我滚动到第20行 - 例如 - 该方法返回超过20 ..

我尝试通过样式表设置行的高度(如here):

StyleSheet sh = editorKit.getStyleSheet();
sh.addRule("body {line-height: 50px}");

但是我在那里设置的像素数无关紧要,结果JTextPane始终具有相同的高度(我正在使用body标签)..

你有什么建议吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果我了解您的要求,您只想知道视口顶部的行号?

以下是将线条放在插入位置的一些代码:

public static int getLineAtCaret(JTextComponent component)
{
    int caretPosition = component.getCaretPosition();
    Element root = component.getDocument().getDefaultRootElement();

    return root.getElementIndex( caretPosition ) + 1;
}

不知道这是否适用于带有图像和表格等各种怪异标签的HTML。在这种情况下,我不确定“行”的含义是什么。

现在很明显,插入符号不会位于视口的顶部,因此您需要修改逻辑以获取视口顶部文本的“偏移量”。

因此,您应该能够使用文本窗格的viewToModel(...)方法。类似的东西:

int y = textPane.getVisibleRect().y;
Point p = new Point(5, y);
int offset = textPane.viewToModel( p );