gpt4 book ai didi

java - 自动滚动 JavaFX TextFlow

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:27 27 4
gpt4 key购买 nike

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

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

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

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

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

  1. 它一直在内部代码上抛出 StackOverflowError 错误,但没有任何解释。
  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() 将看到布局。

关于java - 自动滚动 JavaFX TextFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com