JavaFXWebView滚动问题

JavaFXWebView滚动问题,java,javafx,webview,Java,Javafx,Webview,我已经使用JavaFX开发了一个应用程序,部分使用了WebView。然而,我注意到,当用户或通过JS编程时,WebView被滚动到底部或接近底部,奇怪的事情似乎发生了。我特别希望找到某种方法来阻止这种行为,但仍然需要允许在两种意义上滚动。这类似于疑问句,但它们不一样。我的文章的其余部分解释了正在发生的事情 如果滚动到底部,调整窗口大小使其比以前大,并将鼠标悬停在窗口中的其他JavaFX控件上,则这些控件将变成白色框 为了进行说明,假设您有以下窗口: 滚动到底部,调整窗口大小,使其比以前更大,然

我已经使用JavaFX开发了一个应用程序,部分使用了WebView。然而,我注意到,当用户或通过JS编程时,WebView被滚动到底部或接近底部,奇怪的事情似乎发生了。我特别希望找到某种方法来阻止这种行为,但仍然需要允许在两种意义上滚动。这类似于疑问句,但它们不一样。我的文章的其余部分解释了正在发生的事情

如果滚动到底部,调整窗口大小使其比以前大,并将鼠标悬停在窗口中的其他JavaFX控件上,则这些控件将变成白色框

为了进行说明,假设您有以下窗口:

滚动到底部,调整窗口大小,使其比以前更大,然后将鼠标悬停在JavaFX按钮和文本框上,当您这样做时,它们都会消失:

这种情况至少在使用Java8u111和Java8u51的Windows 10上发生。我举了一个例子来说明这一点:

example.Main.java

package example;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("Example.fxml"));
        BorderPane rootWindow = (BorderPane) loader.load();

        Scene scene = new Scene(rootWindow);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
example.ExampleController.java

package example;

import javafx.concurrent.Worker;
import javafx.fxml.FXML;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

public class ExampleController {
    @FXML private WebView webView;

    @FXML
    private void initialize() {
        WebEngine engine = webView.getEngine();
        engine.load("https://stackoverflow.com");
        engine.getLoadWorker().stateProperty().addListener( (o, oldVal, newVal) -> {
            if (newVal == Worker.State.SUCCEEDED) {
                engine.executeScript("window.scrollTo(0, document.body.scrollHeight);");
            }
        });
    }
}
example.example.fxml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.web.WebView?>

<BorderPane prefHeight="400.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="example.ExampleController">
   <center>
      <WebView fx:id="webView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <BorderPane.margin>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
         </BorderPane.margin>
      </WebView>
   </center>
   <bottom>
      <HBox BorderPane.alignment="CENTER">
         <children>
            <TextField HBox.hgrow="ALWAYS" />
            <Button alignment="TOP_LEFT" mnemonicParsing="false" text="Button" />
         </children>
      </HBox>
   </bottom>
</BorderPane>


有什么方法可以阻止或至少缓解这种情况吗?

我也遇到了同样的问题,我找到了一个解决方案: 向jvm添加一个参数:-Dprism.order=sw

见: