【问题标题】:RichTextFX line numbers column extended for entire text areaRichTextFX 行号列扩展到整个文本区域
【发布时间】:2018-12-03 12:01:52
【问题描述】:

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

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

附:我不确定这是否可能。

【问题讨论】:

标签: java javafx richtextfx


【解决方案1】:

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

我所做的是走私一个矩形并确保它是最底部的元素(即基本上是背景的一部分)。但是,这样做有一些问题,因为底层的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()
  }
}

不幸的是,矩形的颜色必须手动同化。原因是用于行号的Labels 使用-fx-background-color,而Rectangle 使用-fx-fill。因此,仅设置相同的 CSS 类 "lineno"(就像我在上面的代码中所做的那样)几乎无法获得正确的颜色。但它允许我将两者放入同一个 CSS 类中,因此我可以在一个地方进行更改:

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

【讨论】:

  • 我无法解决我的问题,但我最终用 WebView + Ace 编辑器替换了 RichTextFX(主要是出于性能原因)。
猜你喜欢
  • 1970-01-01
  • 2019-02-15
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多