Issue
I want to be able to set the vertical scroll to the top or the bottom of a InlineStyleTextArea
in RichTextFX. By the looks of this thread, moveTo(..)
should do the trick. But it doesn't work for me. I've also tried selectRange(..)
and positionCaret(..)
. Below is my test program, have I misunderstood the "workaround of repositioning the caret" mentioned in the thread linked above?
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();
}
}
Solution
@Tomas Mikula provided the answer in this github thread. I thought I'd put the answer here as well.
The problem with your example is that the moveTo/selectRange work-around does not work before the skin is instantiated. If in your example you surround the selectRange in Platform.runLater, that will give you the desired result. Also note that the range is given in character indices, not line numbers.
Platform.runLater(() -> area.selectRange(10000, 10100));
In the code that results from user's interaction after the text area has already been shown, you will not need Platform.runLater anymore.
Answered By - Jonatan Stenbacka