RichTextFX行号列扩展为整个文本区域

时间:2018-12-03 12:01:52

标签: java javafx richtextfx

有人可以告诉我如何使用行号部分扩展到该区域的末尾来实现RichTextFX CodeArea吗? 现在是这样的:

textareafx sample

我在第12行之后不需要行号,但我希望看到这个灰色条来填充整个文本区域。
像这样的东西:

expected ui

P.S。我不确定这是否可能。

1 个答案:

答案 0 :(得分:2)

我知道这是一个比较老的问题,但是由于我遇到了同样的问题,所以让我分享我想出的解决方案。

我所做的是走私一个矩形并确保它是最底下的元素(即基本上是背景的一部分)。但是,这样做时有些陷阱,因为底层的CodeArea不知道我们的新节点。如果仅插入矩形,则CodeArea决定重建节点时可能会将其删除。正确的宽度有点棘手,因为行号的宽度基本上可以随时更改,并且每当滚动时,行号标签本身就会淡入淡出。

因此,为了解决这些问题,我的代码位于layoutChildren()方法中,因此只要编辑器中的节点发生更改,就会调用我的代码。首先,我们检查矩形是否确实位于最底端,或者如果缺失则将其插入。其次,我们将矩形的宽度设置为第一个可见的行号标签的宽度(如果目前没有段落,则可能会失败)。

这里的代码本身在 Scala 中,但可能很容易以快速地适应 Java

class MyCodeArea extends CodeArea {

  protected val gutterRect = new Rectangle()
  gutterRect.heightProperty.bind(this.heightProperty)
  gutterRect.getStyleClass.add("lineno")

  override protected def layoutChildren(): Unit = {
    try {
      val children = getChildren
      if (!(children.get(0) eq gutterRect))
        children.add(0, gutterRect)
      val index = visibleParToAllParIndex(0)
      val wd = getParagraphGraphic(index).prefWidth(-1)
      gutterRect.setWidth(wd)
    } catch {
      case _: Throwable =>
    }
    super.layoutChildren()
  }
}

不幸的是,矩形的颜色必须手动吸收。原因是用于行号的Label使用-fx-background-color,而Rectangle使用-fx-fill。因此,仅设置相同的CSS类"lineno"(就像我在上面的代码中所做的那样)几乎不能使颜色正确。但这使我可以将它们放在同一个CSS类中,因此在一个地方可以更改它:

.lineno {
    -fx-fill: ivory;  // or whatever colour you like
    -fx-background-color: -fx-fill;
}