gpt4 book ai didi

javafx - 在 RichTextFx CodeArea 中的行号处显示断点

转载 作者:行者123 更新时间:2023-12-02 23:16:43 40 4
gpt4 key购买 nike

我正在与 RichTextFx 合作的 CodeArea 突出显示自定义迷你语言代码。

现在,在执行此代码时,我想在当前执行的行前面显示一个小箭头。我知 Prop 体的行号,但无法使用行号标签发生任何事情。

由于 github 项目声称将显示行号或断点切换作为一项功能,因此这并不是很困难。但无法让任何东西发挥作用...

提前致谢

最佳答案

要显示行前的任意图形,需要设置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(t‌​riangle));

return triangle;
}
}

您创建的每个图形(即绿色小三角形)都将观察给定的 showLine 属性来决定它是否应该可见。随着线条以及线条图形的出现和消失,当不再使用图形时,删除 shownLine 的监听器非常重要。 visible.conditionOnShowing(t‌​riangle) 是一个新属性,它将停止观察 visible 属性(并且自动还会停止 shownLine 属性,这要归功于ReactFX 的惰性绑定(bind)语义),并在三角形不是显示窗口的一部分时重置为常量 false。因此,我们不会因监听器未清理而导致内存或 CPU 泄漏。

这是一个完整的可运行演示,它使用此 ArrowFactory 与 RichTextFX 提供的 LineNumberFactory 相结合来显示行号和一个小三角形。此演示使用 CodeArea 的当前行作为 shownLine 属性。您需要将其替换为包含当前执行行的属性。

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(t‌​riangle));

return triangle;
}
}

这就是结果:

CodeArea with current line indicator

关于javafx - 在 RichTextFx CodeArea 中的行号处显示断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28659716/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com