有人可以告诉我如何使用行号部分扩展到该区域的末尾来实现RichTextFX CodeArea吗? 现在是这样的:
我在第12行之后不需要行号,但我希望看到这个灰色条来填充整个文本区域。
像这样的东西:
P.S。我不确定这是否可能。
答案 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;
}