有人可以告诉我如何实现 RichTextFX CodeArea 并将行号部分延伸到该区域的末尾吗?这是它现在的样子:
第 12 行之后我不需要行号,但我希望看到这个灰色条来填充整个文本区域。
像这里的东西:
PS我不确定这是否可能。
有人可以告诉我如何实现 RichTextFX CodeArea 并将行号部分延伸到该区域的末尾吗?这是它现在的样子:
第 12 行之后我不需要行号,但我希望看到这个灰色条来填充整个文本区域。
像这里的东西:
PS我不确定这是否可能。
我知道这是一个相当老的问题,但由于我遇到了同样的问题,让我分享一下我想出的解决方案。
我所做的是在一个矩形中走私并确保它是最底部的元素(即基本上是背景的一部分)。但是,这样做有一些陷阱,因为底层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;
}