自动滚动 JavaFX TextFlow
Autoscroll JavaFX TextFlow
我有一个 JavaFX TextFlow
包裹在 ScrollPane
中,我试图让它在新的 Text
添加到 [= 时自动滚动到底部11=].
我已经尝试将最大 ScrollPane
的 vvalue
的听众附加到:
ScrollPane
的 vvalue
属性 本身。
- 这会将
ScrollPane
锁定在底部,这是不需要的。
-
ScrollPane
的 viewportBounds
属性。
- 这根本行不通。
TextFlow
的子列表。
- 这滚动到 是 底部 在 添加最新的
Text
之前的位置,很奇怪。我试过在滚动前明确请求布局,但这没有效果
非常感谢,我想滚动这样如果新添加的内容太大而无法一次显示,ScrollPane
滚动以使新添加的内容位于顶部,并且用户应手动滚动以查看 'overflow'。正如我所说,这将是一个额外的好处,只需滚动到底部就可以了,因为我不希望(定期)有这么大的增加。
不,我不会切换到 TextArea
,这样会相对简单。我希望能够轻松地向 TextFlow
添加常规、粗体和斜体文本,而 TextArea
不支持此功能。我也试过 Thomas Mikula 的 RichTextFX,但是
- 它一直在内部代码上抛出
WhosebugError
s 而没有解释。
- 我真的不想为这个项目使用第三方库。
因此,任何适用于 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()
将看到 新 布局。
我有一个 JavaFX TextFlow
包裹在 ScrollPane
中,我试图让它在新的 Text
添加到 [= 时自动滚动到底部11=].
我已经尝试将最大 ScrollPane
的 vvalue
的听众附加到:
ScrollPane
的vvalue
属性 本身。- 这会将
ScrollPane
锁定在底部,这是不需要的。
- 这会将
-
ScrollPane
的viewportBounds
属性。- 这根本行不通。
TextFlow
的子列表。- 这滚动到 是 底部 在 添加最新的
Text
之前的位置,很奇怪。我试过在滚动前明确请求布局,但这没有效果
- 这滚动到 是 底部 在 添加最新的
非常感谢,我想滚动这样如果新添加的内容太大而无法一次显示,ScrollPane
滚动以使新添加的内容位于顶部,并且用户应手动滚动以查看 'overflow'。正如我所说,这将是一个额外的好处,只需滚动到底部就可以了,因为我不希望(定期)有这么大的增加。
不,我不会切换到 TextArea
,这样会相对简单。我希望能够轻松地向 TextFlow
添加常规、粗体和斜体文本,而 TextArea
不支持此功能。我也试过 Thomas Mikula 的 RichTextFX,但是
- 它一直在内部代码上抛出
WhosebugError
s 而没有解释。 - 我真的不想为这个项目使用第三方库。
因此,任何适用于 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()
将看到 新 布局。