我有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
标签)..
你有什么建议吗?
非常感谢你的帮助!
答案 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 );