Javafx 文本区域滚动窗格保留在文本附加中

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

这是我的textarea追加文本的测试代码

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