如何控制JavaFXTextArea自动滚动?

如何控制JavaFXTextArea自动滚动?,java,javafx,textarea,javafx-2,javafx-8,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); 我尝试了这个,但滚动自动下降,但我需要保持我的滚动选择的位置,我不想自动下降

在我的应用程序中,我每2分钟将文本添加到
TextArea
。每当我在
TextArea
中添加新行时,自动滚动会自动向下滚动。但是我想把卷轴留在我现在的位置,保留滚动按钮。如何在JavaFX中实现它

logTextArea.appendText("Here i am appending text to text area"+"\n");
logTextArea.setScrollTop(Double.MIN_VALUE);
我尝试了这个,但滚动自动下降,但我需要保持我的滚动选择的位置,我不想自动下降


我该怎么做呢?

也许你可以在文本区域中添加一个changeListener,它什么也不做,或者每次更改文本时它都会滚动到文本区域的顶部

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.textProperty().addListener(新的ChangeListener()){
@凌驾
公共无效已更改(可观察值可观察、对象旧值、对象新值){
logTextArea.setScrollTop(Double.MIN_值);//这将滚动到顶部
}
});
现在,当您
logTextArea.appendText(“我在这里将文本附加到文本区域”+“\n”)到文本区域,它应该保持在顶部


这个想法来源于:

也许你可以在文本区域中添加一个changeListener,它什么也不做,或者每次更改文本时它都会滚动到文本区域的顶部

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.textProperty().addListener(新的ChangeListener()){
@凌驾
公共无效已更改(可观察值可观察、对象旧值、对象新值){
logTextArea.setScrollTop(Double.MIN_值);//这将滚动到顶部
}
});
现在,当您
logTextArea.appendText(“我在这里将文本附加到文本区域”+“\n”)到文本区域,它应该保持在顶部


这个想法来源于:

最简单的方法是记住插入符号的位置,并在它被
appendText
setText
移动后恢复它

以下是您如何做到这一点:

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

最直接的方法是记住插入符号的位置,并在它被
appendText
setText
移动后恢复它

以下是您如何做到这一点:

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

您可以编写自己的函数来追加文本。在这种方法中,您可以使用,而不是像
appendText
那样自动滚动到内容的末尾(
setText
滚动到开头,但可以通过将设置回其以前的值来抑制)

示例

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);

您可以编写自己的函数来追加文本。在这种方法中,您可以使用,而不是像
appendText
那样自动滚动到内容的末尾(
setText
滚动到开头,但可以通过将设置回其以前的值来抑制)

示例

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);

我需要在哪里添加这个?表示您在哪个类控制器类或应用程序扩展类@user2882590中有一个控制器类,您在其中声明了TextArea。如果我没记错的话,在
public void initialize()
函数中,您可以将此侦听器添加到
logTextArea
,如果它来自fxml文件。如果没有,那么您可以在创建侦听器之后添加它。所以在:
TextArea logTextArea=newtextarea()之后好,但我的问题是在文本区域添加了一些文本后,我正在将我的按钮滚动到中间,之后当我添加文本时,滚动按钮将不会向上移动,它需要保持在中间,只有我想要这样。我该怎么做?我需要在哪里添加这个?表示您在哪个类控制器类或应用程序扩展类@user2882590中有一个控制器类,您在其中声明了TextArea。如果我没记错的话,在
public void initialize()
函数中,您可以将此侦听器添加到
logTextArea
,如果它来自fxml文件。如果没有,那么您可以在创建侦听器之后添加它。所以在:
TextArea logTextArea=newtextarea()之后好,但我的问题是在文本区域添加了一些文本后,我正在将我的按钮滚动到中间,之后当我添加文本时,滚动按钮将不会向上移动,它需要保持在中间,只有我想要这样。我该怎么做?在循环中使用此选项可追加文本。在循环中使用此选项可追加文本。