如何在 setText 之后滚动 JavaFX TextArea

Posted

技术标签:

【中文标题】如何在 setText 之后滚动 JavaFX TextArea【英文标题】:How to scroll JavaFX TextArea after setText 【发布时间】:2013-10-07 22:13:06 【问题描述】:

我正在使用 JavaFX,我想在我先设置 textarea 的文本后,将 textarea 从顶部滚动到某个位置。

我尝试先在我的 textarea 上设置一个侦听器,并在其中使用 setText:

    textArea.textProperty().addListener(new ChangeListener<String>() 
        @Override
        public void changed(final ObservableValue<? extends String> observable, final String oldValue, final String newValue) 
        textArea.setScrollTop(<Here I use the scroll position that I want>);
    
);

然后我尝试通过setText 设置textarea 的文本。但这不会滚动我的文本区域。我应该补充一点,我正在加载书籍长字符串,但它们加载得相当快。在设置文本然后滚动文本区域后,我还尝试在侦听器内使用 1 秒的延迟,结果证明这对我有用,这可能表明我使用了错误的侦听器。我真的希望能够为此使用监听器而不是延迟。

欢迎所有帮助!

【问题讨论】:

Platform.runLater()包裹滚动调用是否有效? 【参考方案1】:

如果你使用这段代码会发生什么?

textarea.addEventHandler(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() 
        @Override
        public void handle(KeyEvent t) 
        //textArea.setScrollTop(<Here I use the scroll position that I want>);
         
       

【讨论】:

【参考方案2】:

你应该把监听器的代码放在一个单独的线程中进行睡眠,然后使用Platform.runLater调用textArea.setScrollTop,这样睡眠不会阻塞平台线程。如果您不这样做,平台线程会被睡眠阻塞,并且 TextArea 上的任何待处理操作也将被阻塞,如果任何待处理操作阻止滚动,它将无法完成并且您的调用将被取消。

【讨论】:

以上是关于如何在 setText 之后滚动 JavaFX TextArea的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX,标签setText中的倒数计时器

如何限制图例大小并使其可使用饼图滚动?和 javafx 布局

JavaFX TextArea onChange 事件

如何一次更新所有JavaFX元素?

JavaFX - 如何从TextArea隐藏滚动条?

JavaFX:如何滚动到textarea中的特定行