我正在使用RichTextFx的CodeArea来突出显示自定义迷你语言代码。
现在执行此代码时,我想在当前执行的行前面显示一个小箭头。我知道具体的行号,但行号标签不能发生任何事情。
由于github项目声称将行号或断点切换显示为一个特征,因此这不是很困难。但无法获得任何工作......
提前致谢
答案 0 :(得分:13)
要在线前显示任何图形,您需要设置"段图形工厂" CodeArea的。这个图形工厂只是一个函数int -> Node
:给定行号,它返回一个Node
,它将显示在该行的前面。
这是一个图形工厂,它生成一个指向该线的绿色三角形。只有当行等于给定的整数属性shownLine
时才会显示。
class ArrowFactory implements IntFunction<Node> {
private final ObservableValue<Integer> shownLine;
ArrowFactory(ObservableValue<Integer> shownLine) {
this.shownLine = shownLine;
}
@Override
public Node apply(int lineNumber) {
Polygon triangle = new Polygon(0.0, 0.0, 10.0, 5.0, 0.0, 10.0);
triangle.setFill(Color.GREEN);
ObservableValue<Boolean> visible = Val.map(
shownLine,
sl -> sl == lineNumber);
triangle.visibleProperty().bind(visible.conditionOnShowing(triangle));
return triangle;
}
}
您创建的每个图形(即小绿色三角形)将观察给定的shownLine
属性以确定它是否应该可见。随着线条以及线条图形的出现和移动,在不再使用图形时移除shownLine
的监听器非常重要。 visible.conditionOnShowing(triangle)
是一个新属性,它将停止观察visible
属性(并且自动也是shownLine
属性,这要归功于ReactFX的延迟绑定语义)并重置为常量{{1每当三角形不是显示窗口的一部分时。因此,由于未清理的侦听器,我们不会导致内存或CPU泄漏。
这是一个完整的可运行演示,它使用此false
与RichTextFX提供的ArrowFactory
相结合来显示行号和一个小三角形。此演示使用CodeArea的当前行作为LineNumberFactory
属性。您将希望将其替换为包含当前执行行的属性。
shownLine
这就是结果: