在我的应用程序中,我每隔2分钟将文本附加到TextArea
。当我向TextArea
添加新行时,自动滚动会自动向下。但我想保留滚动按钮,我保持滚动按钮。如何在JavaFX中完成。
logTextArea.appendText("Here i am appending text to text area"+"\n");
logTextArea.setScrollTop(Double.MIN_VALUE);
我试过这个但是自动滚动下去,但我需要保持我的滚动选择位置我不想自动下降。
我该怎么做?
答案 0 :(得分:1)
最直接的方法是记住插入符号的位置,并在它被appendText
或setText
移动后将其还原。
以下是您可以这样做的方法:
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时,它应该保持在顶部。
答案 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);