自动滚动 JavaFX TextFlow

Autoscroll JavaFX TextFlow

我有一个 JavaFX TextFlow 包裹在 ScrollPane 中,我试图让它在新的 Text 添加到 [= 时自动滚动到底部11=].

我已经尝试将最大 ScrollPanevvalue 的听众附加到:

非常感谢,我想滚动这样如果新添加的内容太大而无法一次显示,ScrollPane 滚动以使新添加的内容位于顶部,并且用户应手动滚动以查看 'overflow'。正如我所说,这将是一个额外的好处,只需滚动到底部就可以了,因为我不希望(定期)有这么大的增加。

不,我不会切换到 TextArea,这样会相对简单。我希望能够轻松地向 TextFlow 添加常规、粗体和斜体文本,而 TextArea 不支持此功能。我也试过 Thomas Mikula 的 RichTextFX,但是

  1. 它一直在内部代码上抛出 WhosebugErrors 而没有解释。
  2. 我真的不想为这个项目使用第三方库。

因此,任何适用于 TextFlow 的解决方案都将不胜感激。

编辑:解决方案,按要求:

private ScrollPane textContainer;
private TextFlow text;

public BaseGui() {
    //....
    text.getChildren().addListener(
                (ListChangeListener<Node>) ((change) -> {
                    text.layout();
                    textContainer.layout();
                    textContainer.setVvalue(1.0f);
                }));
    textContainer.setContent(text);
    //....
}

public void appendBold(String msg) { //similar for italic and regular
    append(msg, "-fx-font-weight: bold");
}

private synchronized void append(String msg, String style) {
    Platform.runLater(() -> {
        Text t = new Text(msg);
        t.setFont(segoe(13));
        if (!style.equals("")) {
            t.setStyle(style);
        }
        text.getChildren().add(t);
    });
}

它不会赢得任何代码风格奖,但由于这是一个个人项目,我并不关心。

修改您的第三种方法以使用 layout() 而不是 requestLayout()

requestLayout() 将布局标记为 并导致在 下一个脉冲 上重新布局。代码中

requestLayout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout() 将看到 布局。

layout() 立即(同步)执行布局,但前提是布局为 。 (在您的例子中,TextFlow 文本的更改将其布局标记为脏。)在代码中

layout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout() 将看到 布局。