【问题标题】:Java - getting/setting line height of JTextPane with content type "text/html"Java - 获取/设置内容类型为“text/html”的 JTextPane 的行高
【发布时间】:2016-12-15 03:33:21
【问题描述】:

我有一个内容类型为“text/html”的JTextPane。它集成在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 标签)..

你有什么建议吗??

非常感谢您的帮助!

【问题讨论】:

  • 一个 HTML 文档可以包含多种字体的内容。您是否尝试确定 body 元素字体的行高?

标签: java css swing jtextpane


【解决方案1】:

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

以下是一些用于在插入符号位置获取行的代码:

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

    return root.getElementIndex( caretPosition ) + 1;
}

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

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

所以您应该可以使用文本窗格的viewToModel(...) 方法。比如:

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

【讨论】:

  • 是的,这正是我的要求!我与计算的偏移量和 getLineAtCaret 的结果有什么关系?相加,相减?我真的不明白,对不起!
  • P.S.:如果我可以设置线高(不幸的是,上面提到的例子不起作用),我会知道线有多高。这也可以解决我的要求
  • @mrbela,我说您需要从提供的方法中“更改”代码。您需要使用视口的偏移量,而不是使用插入符号的偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多