1

有人可以告诉我如何实现 RichTextFX CodeArea 并将行号部分延伸到该区域的末尾吗?这是它现在的样子:

textareafx 示例

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

预期的用户界面

PS我不确定这是否可能。

4

1 回答 1

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用于行号的 s 使用-fx-background-color,而Rectangle使用-fx-fill. 因此,仅设置相同的 CSS 类"lineno"(就像我在上面的代码中所做的那样)对颜色正确无济于事。但它允许我将两者放入同一个 CSS 类中,因此我可以在一个地方进行更改:

.lineno {
    -fx-fill: ivory;  // or whatever colour you like
    -fx-background-color: -fx-fill;
}
于 2020-05-15T15:26:05.010 回答