我有一个JavaFX TextFlow封装在一个ScrollPane中,每当一个新的Text被添加到TextFlow中时,我试图让它自动滚动到底部。
我尝试过将ScrollPane的vvalue的侦听器附加到:
ScrollPane的vvalue属性本身. ScrollPane锁定到底部,这是不需要的。
ScrollPane的viewportBounds属性.
TextFlow的孩子名单. Text添加之前的底部。在滚动之前,我已经尝试过显式请求布局,但这没有任何效果。
为了更大的感谢,我希望滚动这样的内容:如果新添加的内容太大,无法立即显示,ScrollPane滚动使新添加位于顶部,用户应该手动滚动以查看“溢出”。正如我所说的,这将是一个额外的奖励,只是滚动到底部将是很好的,因为我不期望这么大的增加(定期)。
不,我不想转到TextArea上,因为这会比较简单。我希望能够轻松地向TextFlow添加常规、粗体和斜体文本,而TextArea不支持这一点。我也试过托马斯·米库拉的RichTextFX,但是
StackOverflowError,而没有解释。因此,任何与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);
});
}它不会因为代码风格赢得任何奖项,但由于这是一个个人项目,我并不真正关心。
发布于 2015-01-30 21:29:49
修改第三种方法,使用layout()而不是requestLayout()。
requestLayout()将布局标记为脏,并导致在下一个脉冲上重新布局。在代码中
requestLayout();
doSomethingThatDependsOnLayout();doSomethingThatDependsOnLayout()将看到旧的布局。
layout()立即执行布局(同步),但只在布局脏的情况下执行。(在您的示例中,TextFlow的文本更改将其布局标记为脏。)在代码中
layout();
doSomethingThatDependsOnLayout();doSomethingThatDependsOnLayout()将看到新的布局。
https://stackoverflow.com/questions/28243156
复制相似问题