4

我有一个TextFlow包装在.ScrollPaneTextTextFlow

我已经尝试将最大的监听ScrollPane器附加vvalue到:

  • 的属性本身 ScrollPanevvalue
    • 这会将 锁定ScrollPane到底部,这是不希望的。
  • 的财产 ScrollPaneviewportBounds
    • 这只是行不通。
  • TextFlow孩子名单。
    • 奇怪的是,这会滚动到添加最新版本之前底部位置。Text我曾尝试在滚动之前明确请求布局,但这没有效果

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

不,我不会切换到 a TextArea,这会相对简单。我希望能够轻松地将常规、粗体和斜体文本添加到 中TextFlow,并且TextArea不支持这一点。我也试过 Thomas Mikula 的RichTextFX,但是

  1. StackOverflowError它不断地在内部代码上抛出s 而没有解释。
  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);
    });
}

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

4

1 回答 1

4

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

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

requestLayout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout()将看到布局。

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

layout();
doSomethingThatDependsOnLayout();

doSomethingThatDependsOnLayout()将看到的布局。

于 2015-01-30T21:29:49.553 回答