Javafx 文本区域滚动窗格保留在文本附加中
这是我的textarea追加文本的测试代码Javafx 文本区域滚动窗格保留在文本附加中,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,这是我的textarea追加文本的测试代码 public class TextAreaScrollHold extends Application { TextArea area = new TextArea(); @Override public void start(Stage primaryStage) { StackPane root = new StackPane(); root.getChildren().add(area
public class TextAreaScrollHold extends Application {
TextArea area = new TextArea();
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
root.getChildren().add(area);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
addTextInTextArea();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public void addTextInTextArea() {
for (int i = 0; i < 15; i++) {
area.appendText("Hello World " + i + "\n");
}
Task<Void> task = new Task() {
@Override
protected Void call() throws Exception {
for (int i = 15; i < 100; i++) {
area.appendText("Hello World " + i + "\n");
Thread.sleep(1000);
}
return null;
}
};
new Thread(task).start();
}
}
公共类TextAreaScrollHold扩展应用程序{
TextArea=新建TextArea();
@凌驾
公共无效开始(阶段primaryStage){
StackPane root=新的StackPane();
root.getChildren().add(区域);
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
addTextInTextArea();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
public void addTextInTextArea(){
对于(int i=0;i<15;i++){
area.appendText(“Hello World”+i+“\n”);
}
任务=新任务(){
@凌驾
受保护的Void调用()引发异常{
对于(int i=15;i<100;i++){
area.appendText(“Hello World”+i+“\n”);
睡眠(1000);
}
返回null;
}
};
新线程(任务).start();
}
}
我的代码数据将在线程中更新。我需要如何保持在滚动条时,在文本区的数据更新。我有参考文献,但如何解决这个问题
我需要
- 当文本区域中的数据更新时,我将滚动文本区域滚动条,滚动条将保持不变
textArea.scrollTopProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { textArea.setScrollTop(100); } });
textArea.scrollTopProperty().addListener(新的ChangeListener()){ @凌驾 public void已更改(observeValue您可以使用and(是的,setter的方法名对于Java来说很难使用) 我很快为您起草了一些代码,使用滚动锁定按钮启用/禁用滚动:
import javafx.application.Application; import javafx.concurrent.Task; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.TextArea; import javafx.scene.control.ToggleButton; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class ConsoleDemo extends Application { Console console = new Console(); @Override public void start(Stage primaryStage) { StackPane root = new StackPane(); root.getChildren().add(console); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Console Demo"); primaryStage.setScene(scene); primaryStage.show(); addTextInTextArea(); } /** * @param args * the command line arguments */ public static void main(String[] args) { launch(args); } public void addTextInTextArea() { for (int i = 0; i < 15; i++) { console.log("Hello World " + i); } Task<Void> task = new Task() { @Override protected Void call() throws Exception { for (int i = 15; i < 100; i++) { console.log("Hello World " + i); Thread.sleep(1000); } return null; } }; new Thread(task).start(); } public class Console extends BorderPane { TextArea textArea = new TextArea(); int scrollLockPos = -1; public Console() { HBox toolbar = new HBox(); ToggleButton scrollLockButton = new ToggleButton("Scroll Lock"); scrollLockButton.setOnAction(e -> { if (scrollLockButton.isSelected()) { scrollLockPos = textArea.getCaretPosition(); } else { scrollLockPos = -1; } }); HBox.setMargin(scrollLockButton, new Insets(5, 5, 5, 5)); toolbar.getChildren().add(scrollLockButton); setCenter(textArea); setTop(toolbar); } public void log(String text) { textArea.appendText(text + "\n"); if (scrollLockPos != -1) { textArea.positionCaret(scrollLockPos); } } } }
@Reegan Miranda:请检查控制台的备用版本。您可以使用该控制台保持选择状态,并在滚动锁定时选择和复制文本。控制台的备用版本是什么。我编辑了我的答案。“编辑”中的代码使用selectRange而不是positionCaret。它允许您在锁定滚动时选择文本。import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.IndexRange; import javafx.scene.control.TextArea; import javafx.scene.control.ToggleButton; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; /** * Console which provides a mechanism to lock scrolling. Selecting text and copying it works while scrolling is locked. */ public class Console extends BorderPane { TextArea textArea = new TextArea(); ToggleButton scrollLockButton; IndexRange range; public Console() { initComponents(); } private void initComponents() { // toolbar HBox toolbar = new HBox(); toolbar.setAlignment(Pos.CENTER_RIGHT); // clear Button clearButton = new Button("Clear"); clearButton.setOnAction(e -> { textArea.clear(); }); // scroll lock scrollLockButton = new ToggleButton("Scroll Lock"); // button positions & layout Insets insets = new Insets(5, 5, 5, 5); HBox.setMargin(clearButton, insets); HBox.setMargin(scrollLockButton, insets); toolbar.getChildren().addAll(clearButton,scrollLockButton); // component layout setCenter(textArea); setTop(toolbar); } public void log(String text) { if (scrollLockButton.isSelected()) { range = textArea.getSelection(); } textArea.appendText(text + "\n"); if (scrollLockButton.isSelected()) { textArea.selectRange(range.getStart(), range.getEnd()); } } }