如何控制JavaFX TextArea自动滚动?

时间:2016-08-23 10:27:30

标签: java javafx textarea javafx-2 javafx-8

在我的应用程序中,我每隔2分钟将文本附加到TextArea。当我向TextArea添加新行时,自动滚动会自动向下。但我想保留滚动按钮,我保持滚动按钮。如何在JavaFX中完成。

logTextArea.appendText("Here i am appending text to text area"+"\n");
logTextArea.setScrollTop(Double.MIN_VALUE);

我试过这个但是自动滚动下去,但我需要保持我的滚动选择位置我不想自动下降。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

最直接的方法是记住插入符号的位置,并在它被appendTextsetText移动后将其还原。

以下是您可以这样做的方法:

int caretPosition = area.caretPositionProperty().get();
area.appendText("Here i am appending text to text area"+"\n");
area.positionCaret(caretPosition);

答案 1 :(得分:0)

也许你可以只将一个changeListener添加到TextArea中,它不会做任何事情,或者它只是在每次改变其中的文本时滚动到TextArea的顶部。

logTextArea.textProperty().addListener(new ChangeListener<Object>() {
  @Override
  public void changed(ObservableValue<?> observable, Object oldValue, Object newValue) {
      logTextArea.setScrollTop(Double.MIN_VALUE); //this will scroll to the top
  }
});

现在当你logTextArea.appendText("Here i am appending text to text area"+"\n");到TextArea时,它应该保持在顶部。

这个想法来自:JavaFX TextArea and autoscroll

答案 2 :(得分:0)

您可以编写自己的函数来附加文本。在此方法中,您可以使用setText而不是appendText,因为appendText会自动滚动到内容的末尾(setText滚动到开头,但这可以通过设置来抑制将scrollTopProperty恢复为之前的值。

示例

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);

            TextArea ta = new TextArea();
            root.setCenter(ta);
            Button button = new Button("Append");
            button.setOnAction(e -> {
                appendTextToTextArea(ta, "BlaBlaBla\n");
            });
            root.setBottom(button);

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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


    /**
     * Appends text to the end of the specified TextArea without moving the scrollbar.
     * @param ta TextArea to be used for operation.
     * @param text Text to append.
     */
    public static void appendTextToTextArea(TextArea ta, String text) {
        double scrollTop = ta.getScrollTop();
        ta.setText(ta.getText() + text);
        ta.setScrollTop(scrollTop);
    }
}

注意:

或者,您也可以扩展TextArea并重载appendText,以便能够指定是否要移动滚动条:

public class AppendableTextArea extends TextArea {

    public void appendText(String text, Boolean moveScrollBar) {
        if (moveScrollBar)
            this.appendText(text);
        else {
            double scrollTop = getScrollTop();
            setText(getText() + text);
            setScrollTop(scrollTop);
        }
    }
}

和用法:

AppendableTextArea ta = new AppendableTextArea();
ta.appendText("BlaBlaBla\n", false);