如何控制JavaFXTextArea自动滚动?
在我的应用程序中,我每2分钟将文本添加到如何控制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); 我尝试了这个,但滚动自动下降,但我需要保持我的滚动选择的位置,我不想自动下降
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()之后代码>好,但我的问题是在文本区域添加了一些文本后,我正在将我的按钮滚动到中间,之后当我添加文本时,滚动按钮将不会向上移动,它需要保持在中间,只有我想要这样。我该怎么做?在循环中使用此选项可追加文本。在循环中使用此选项可追加文本。