JavaFX-使滚动窗格自动滚动

JavaFX-使滚动窗格自动滚动,java,user-interface,scroll,javafx,label,Java,User Interface,Scroll,Javafx,Label,我在滚动窗格中有一个标签。我正在更新循环中的标签(在另一个线程中)。如果用户没有将滚动窗格保持在某个位置,我如何更新滚动窗格以使其向下滚动(而不是侧向滚动,这将手动完成)?是否有设置程序?要将滚动窗格设置到底部,请自动设置滚动窗格元素的v值,如下所示: @FXML private ScrollPane scroll; //this must match the fx:id of the ScrollPane element scroll.setVvalue(1.0); //1

我在滚动窗格中有一个标签。我正在更新循环中的标签(在另一个线程中)。如果用户没有将滚动窗格保持在某个位置,我如何更新滚动窗格以使其向下滚动(而不是侧向滚动,这将手动完成)?是否有设置程序?

要将滚动窗格设置到底部,请自动设置滚动窗格元素的
v值,如下所示:

@FXML private ScrollPane scroll; //this must match the fx:id of the ScrollPane element
scroll.setVvalue(1.0);           //1.0 means 100% at the bottom

@数学谢谢,这很有效

@FXML private ScrollPane scroll; //this must match the fx:id of the ScrollPane element or be the scrollpane object
scroll.setVvalue(1.0);           //1.0 means 100% at the bottom
我用这部分代码解决了“必须查看选项卡”的问题

tab.setOnSelectionChanged(new EventHandler<Event>() {
    @Override
    public void handle(Event arg0) {
        ScrollPane.setVvalue(1.0);
    }        
});
tab.setOnSelectionChanged(新的EventHandler(){
@凌驾
公共无效句柄(事件arg0){
滚动窗格。设置值(1.0);
}        
});

如果在滚动窗格中使用HBox或VBox,请尝试以下操作:

hBox.heightProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue observable, Object oldvalue, Object newValue) {
        scrollPane.setHvalue((Double)newValue );  
    }
});

这在我的代码中起作用:

scrollPane.vvalueProperty().bind(mainGrid.heightProperty());

在我的例子中,scrollPane包含mainGrid

要将滚动窗格完全滚动到底部,请将其设置为
1.0

scrollPane.setVvalue(1D);
注意:在调整滚动窗格内容的大小后调用时,这可能不起作用。
在这种情况下,如果通过<代码>平台延迟调用。RunTouter()/代码>不能解决问题,请考虑响应内容失效事件设置属性值:

vBox.heightProperty().addListener(observable -> scrollPane.setVvalue(1D));

这应该可以做到:

// adding a new row
vbox_event.addEventRow((Integer) null, null);
// scroll to bottom
Platform.runLater(new Runnable() {
    @Override
    public void run() {
        scrollpane.setVvalue(1.0);
    }
});

如果用户没有将其保持在某个位置,您能解释一下这个问题吗?如果用户没有滚动,这是不起作用的。(主题外:为什么使用FXML?(我有时使用java和CSS))。实际上,只有当我在选项卡上时,它才起作用。(如果我打开了特定选项卡),
FXML
文件是构建场景的地方,然后在
Controller.java
中,通过元素的
fx:id
操纵与变量关联的元素。如果仅当您在选项卡中时,它才起作用,则意味着您必须将
.setVvalue()
放在其他位置,具体取决于您想何时启动它,可能是在线程中的某个位置以及您在标签中写入的位置。我使用纯javaWell构建了我的场景。。您也有此选项,但我放弃了此选项,因为我知道
SceneBuilder
。它在IDE上独立工作,并自动生成
FXML
文件。在我看来,至少值得一看。知道了。我有个主意。因为只有当我查看选项卡时,这个方法才有效,所以我将添加一个侦听器(选项卡更改/选择事件),然后设置vvalue。我遇到了不同的代码片段。他们都没有工作。我有一个选项卡实际上在你的问题中没有太多信息说明什么事件应该触发卷轴,所以我不可能自己决定。无论如何,谢谢。整个问题都在账单上,但我想我应该包括我所做的,以防有人觉得有用!只有当框的高度大于或等于
1.0
时,这才是偶然的,这是
hvalue
属性的默认最大值,而该属性反过来应该是
vvalue
。因此,一个无效侦听器就足够了。有关更正确的解决方案,请参阅。