如何在RichTextFx中设置垂直滚动

时间:2015-10-09 09:37:11

标签: javafx richtextfx

我希望能够将垂直滚动设置为RichTextFXInlineStyleTextArea的顶部或底部。通过this线程的外观,moveTo(..)应该可以解决问题。但它对我不起作用。我还尝试了selectRange(..)positionCaret(..)。下面是我的测试程序,我是否误解了上面链接的线程中提到的“重新定位插入符的解决方法”?

import org.fxmisc.richtext.InlineStyleTextArea;

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;

    public class RichTextFXTest extends Application {

    @Override
    public  void start(Stage stage) {

        InlineStyleTextArea<StyleInfo> area = new InlineStyleTextArea<>(
                new StyleInfo(), styleInfo -> styleInfo.toCss());
                area.setPrefSize(300, 300);
        area.setWrapText(false);
                area.setEditable(false);

                StringBuilder largeText = new StringBuilder();

                for (int i = 0; i < 5000; i++) {
                largeText.append("Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n");
                }

                area.replaceText(largeText.toString());

                // None of the two rows below works.
                //area.selectRange(1000, 1100);
                //area.moveTo(1100);
                //area.positionCaret(1100);

                HBox rootLayout = new HBox();
                rootLayout.setPrefSize(300, 300);
                rootLayout.getChildren().add(area);

                Scene scene = new Scene(rootLayout);
                stage.setScene(scene);
                stage.show();
     }

     // Style class
        class StyleInfo {
            String toCss() {
                return "-fx-fill: red;
            } 
    }

    public static void main (String[] args) {
            launch();
    }
}

2 个答案:

答案 0 :(得分:2)

@Tomas Mikula在this github线程中提供了答案。我以为我也把答案放在这里。

  

你的例子的问题是moveTo / selectRange   在实例化皮肤之前,解决方法不起作用。如果在你的   例如,您将在Platform.runLater中包围selectRange   给你想要的结果。另请注意,范围在   字符索引,而不是行号。

     

Platform.runLater(() -> area.selectRange(10000, 10100));

     

在代码中   这是由文本区域之后的用户交互产生的   已经显示,你将不再需要Platform.runLater。

答案 1 :(得分:0)

您可以这样做:

int pos = 1100;
area.moveTo(pos);
area.requestFollowCaret();