【问题标题】:Show breakpoint at line number in RichTextFx CodeArea在 RichTextFx CodeArea 中的行号处显示断点
【发布时间】:2015-02-22 15:40:28
【问题描述】:

我正在使用 RichTextFx 的 CodeArea 来突出显示自定义迷你语言代码。

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

由于 github 项目声称将显示行号或断点切换作为一项功能,因此这并不是很困难。但是什么都做不了……

提前致谢

【问题讨论】:

    标签: javafx breakpoints line-numbers richtextfx


    【解决方案1】:

    要在行前显示任何图形,需要设置 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;
        }
    }
    

    您创建的每个图形(即绿色小三角形)都将观察给定的shownLine 属性以决定它是否应该可见。随着线条和线条图形的来来去去,当图形不再使用时,移除shownLine 的侦听器很重要。 visible.conditionOnShowing(t‌​riangle) 是一个新属性,它将停止观察 visible 属性(并且由于 ReactFX 的惰性绑定语义,自动也停止观察 shownLine 属性)并在三角形不是显示窗口的一部分时重置为常量 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;
        }
    }
    

    结果如下:

    【讨论】:

    • 我想使用 Val.conditionOnShowing(Node): triangle.visibleProperty().bind(visible.conditionOnShowing(triangle)); 会更容易理解还是我错过了一些重要的东西?
    • 你是绝对正确的。唯一的原因是这个答案早于conditionOnShowing 的存在。我会更新答案。谢谢!
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多