Javafx 在RichTextFx代码区的行号处显示断点
我正在使用的CodeArea突出显示自定义迷你语言代码 现在,在执行这段代码时,我想在当前执行的行前面显示一个小箭头。我知道具体的行号,但行号标签没有任何问题 由于github项目声称显示行号或断点切换是一项功能,所以这不会很困难。但是什么都没用Javafx 在RichTextFx代码区的行号处显示断点,javafx,breakpoints,line-numbers,richtextfx,Javafx,Breakpoints,Line Numbers,Richtextfx,我正在使用的CodeArea突出显示自定义迷你语言代码 现在,在执行这段代码时,我想在当前执行的行前面显示一个小箭头。我知道具体的行号,但行号标签没有任何问题 由于github项目声称显示行号或断点切换是一项功能,所以这不会很困难。但是什么都没用 提前感谢要在行前显示任何图形,您需要设置代码区的“段落图形工厂”。此图形工厂只是一个函数int->Node:给定行号,它返回一个将显示在行前的节点 这是一个图形工厂,它生产一个指向直线的绿色三角形。只有当该行等于给定的整数属性时,才会显示该行shown
提前感谢要在行前显示任何图形,您需要设置代码区的“段落图形工厂”。此图形工厂只是一个函数
int->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;
}
}
这就是结果:
我想使用Val.conditionShowing(节点)更容易理解:triangle.visibleProperty().bind(visible.conditionShowing(triangle))还是我错过了什么重要的事情?你说得绝对正确。唯一的原因是这个答案早于条件showing
的存在。我会更新答案。谢谢
import java.util.function.IntFunction;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;
import org.fxmisc.richtext.CodeArea;
import org.fxmisc.richtext.LineNumberFactory;
import org.reactfx.value.Val;
public class CodeAreaWithLineIndicator extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
CodeArea codeArea = new CodeArea();
IntFunction<Node> numberFactory = LineNumberFactory.get(codeArea);
IntFunction<Node> arrowFactory = new ArrowFactory(codeArea.currentParagraphProperty());
IntFunction<Node> graphicFactory = line -> {
HBox hbox = new HBox(
numberFactory.apply(line),
arrowFactory.apply(line));
hbox.setAlignment(Pos.CENTER_LEFT);
return hbox;
};
codeArea.setParagraphGraphicFactory(graphicFactory);
primaryStage.setScene(new Scene(new StackPane(codeArea), 600, 400));
primaryStage.show();
}
}
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;
}
}