JavaFX的自动向下滚动滚动窗格(JavaFX auto-scroll down scrollpa

2019-07-03 11:22发布

是否有向下自动滚屏的任何一个ScrollPane控制时,它的内容的高度的增加? 例如,我在屏幕底部的TitledPane(一个ScrollPane内),当我展开我想将ScrollPane向下滚动,所以我可以看到TitledPane的全部内容。

Answer 1:

您可以实现这种行为随着组合titledPane.localToScene()scrollPane.setVvalue()

首先是获得titledPane的坐标,而第二个是设置滚动窗格的垂直栏的位置。 请注意,它的范围是0 - 1之间。



Answer 2:

你可以bindScrollPane vvalue与物业heightProperty内的容器。 例如,如果你有一个VBoxScrollPane

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


Answer 3:

你必须告诉滚动窗格哪里是当前坐标值之前传递到垂直或水平吧。

此代码工作非常正常,我:

// the owner's node of your scrollPane;
titledPane.layout(); 
// the maxValue for scrollPane bar ( 1.0 it's the default value )
scrollPane.setVvalue( 1.0d ); 

你有你的地方滚动面板增长实现代码。 例如,如果您将节点添加到滚动窗格内节点,将它们添加一个监听到它的儿童名单。

如果滚动窗格的内部节点改变它的高度,一个监听器添加到heightProperty。

例如,您的滚动窗格内节点这是一个AnchorPane和添加节点此窗格,所以这样做:

anchorPane.getChildren().addListener( 
    ( ListChangeListener.Change<? extends Node> c ) -> {
        titledPane.layout();
        scrollPane.setVvalue( 1.0d ); 
    }
);

如果这是它生长的高度...

heightProperty().addListener(
    (observable, oldValue, newValue) -> {
        titledPane.layout();
        scrollPane.setVvalue( 1.0d ); 
    }
);

而已!



Answer 4:

您可以添加一个侦听这样的TitledPane的高度属性:

titledPane.heightProperty().addListener((observable, oldValue, newValue) -> 
       vvalueProperty().set(newValue.doubleValue()));


Answer 5:

唐诺如果它仍然是相关的,我也有过类似的问题上下的这个解决方案为我工作。 我需要滚动条自动滚动在MVVM模式。 我所做的是绑定的textarea的scrollTopProperty与在视图模型一个SimpleDoubleProperty观。 唯一的问题是,scrollTopProperty,基本上滚动基于像素,所以我增加了它的基础上车道* 100的数量;

视图

textArea.textProperty().bindBidirectional(viewModel.SimpleStringProperty());
textArea.scrollTopProperty().bindBidirectional(viewModel.SimpleDoubleProperty());

视图模型

SimpleDoubleProperty.setValue(SimpleStringProperty.getValue().split("\n").length * 100);

我知道这些代码是不是真的代表,但如果有人需要实现的更多细节,我可以详细...



Answer 6:

我通过使用AnimationTimer做到了。 我不得不等待亿纳秒,以确保将ScrollPane已反应到扩大Titlepane。

public void scrollNodeInTopScrollPane(Node n, ScrollPane s) {
    final Node node = n;
    final ScrollPane clientTopScrollPane = s;
    AnimationTimer timer = new AnimationTimer() {
        long lng = 0;
        @Override
        public void handle(long l) {
            if (lng == 0) {
                lng = l;                   
            }                
            if (l > lng + 100000000) {                   
                if (node.getLocalToSceneTransform().getTy() > 20) {                      
                    clientTopScrollPane.setVvalue(clientTopScrollPane.getVvalue() + 0.05);                        
                    if (clientTopScrollPane.getVvalue() == 1) {
                        this.stop();                          
                    }
                } else {
                    this.stop();
                }
            }                
        }
    };
    timer.start();
}


文章来源: JavaFX auto-scroll down scrollpane
标签: java javafx-2