JavaFx:一旦到达内部滚动视图的末尾,则启用外部滚动视图

时间:2020-09-02 13:42:16

标签: javafx webview scrollpane

我有一个父级滚动窗格,其中包含一个webview作为其子级之一。当我通过将鼠标指针放在Webview区域上来滚动浏览Webview时,它将继续按预期方式滚动直到Webview的结尾。但是,有没有一种方法可以使到达父级Web视图的末尾的父级滚动窗格向下滚动,而鼠标指针仍位于WebView区域上?

样本结构:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.web.*?>

<ScrollPane prefHeight="455.0" prefWidth="602.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="wes.we.fx.view.ui.express.reports.generic.Demo">
   <content>
      <AnchorPane prefHeight="400.0" prefWidth="600.0">
         <children>
            <VBox layoutX="26.0">
               <children>
                  <WebView prefHeight="316.0" prefWidth="530.0" />
               </children>
            </VBox>
         </children>
      </AnchorPane>
   </content>
</ScrollPane>

1 个答案:

答案 0 :(得分:0)

我的解决方案的说明:当使用WebView时,您可以注入javascript,这是我用来提取页面值以找出底部的javascript的方式。我不是JavaScript向导,所以我不确定这里是否有更好的解决方案(我找不到一个)。我使用screenTopPosition + screenTotalHeight的公式来获得screenBottomPosition并将其与totalPageHeight进行比较(如果它们相等),那么您位于页面底部,这一切都按预期进行。在这里,我感到它很“笨拙”,在页面底部时,我不知道如何从scrollPane获取滚动条的焦点。因此,我唯一的想法是,当您位于网页底部时,将scrollPane Vvalue增加固定值。问题是您选择增加的值可能与我选择的.0.1实际滚动值增加不同。一旦Vvalue达到1,它便位于scrollPane

的底部

这并不是我想要解决此问题的确切方式,希望有人可以推荐一个更好的解决方案,使您感觉不太“笨拙”,如果提供有关如何弄清楚默认增量是多少的指导,我将很高兴编辑我的答案。 Vvalue

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setPrefSize(602, 455);

        AnchorPane anchorPane = new AnchorPane();
        anchorPane.setPrefSize(600, 400);
        scrollPane.setContent(anchorPane);

        VBox vBox = new VBox();
        vBox.setPrefWidth(530);
        vBox.setLayoutX(26);
        anchorPane.getChildren().add(vBox);

        WebView webView = new WebView();
        webView.setPrefSize(530,316);
        webView.getEngine().load("http://www.google.com");
        webView.setOnScroll(event -> {
            Integer screenTopPosition = (Integer) (webView.getEngine().executeScript("document.body.scrollTop"));
            Integer screenTotalHeight = (Integer) webView.getEngine().executeScript("document.body.clientHeight");
            Integer screenBottomPosition = screenTopPosition + screenTotalHeight;

            Integer totalPageHeight = (Integer) webView.getEngine().executeScript("document.body.scrollHeight");

            if(screenBottomPosition.equals(totalPageHeight)){
                System.out.println("Bottom of Page Reached");
                scrollPane.setVvalue(scrollPane.getVvalue()+.1);
            }
        });
        vBox.getChildren().add(webView);

        Label label = new Label("Content\nContent");
        label.setFont(new Font(100));
        vBox.getChildren().add(label);

        stage.setScene(new Scene(scrollPane));
        stage.show();
    }
}
相关问题