问题描述
我有一个父级滚动窗格,其中包含一个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>
解决方法
我的解决方案的说明:当使用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();
}
}