【问题标题】:JavaFX:how to resize the stage when using webviewJavaFX:使用 webview 时如何调整舞台大小
【发布时间】:2017-07-19 06:06:15
【问题描述】:

例如:

public class WebViewTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        final WebView view = new WebView();
        final WebEngine webEngine = view.getEngine();


        Scene scene = new Scene(view, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();

        Platform.runLater(() -> {
            webEngine.getLoadWorker().progressProperty().addListener(new ChangeListener<Number>() {
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                    if (newValue.doubleValue() == 1D) {
                        String heightText = webEngine.executeScript(
                                "window.getComputedStyle(document.body, null).getPropertyValue('height')"
                                                                   ).toString();
                        double height = Double.valueOf(heightText.replace("px", ""));

                        String widthText = webEngine.executeScript(
                                "window.getComputedStyle(document.body, null).getPropertyValue('width')"
                                                                  ).toString();
                        double width = Double.valueOf(widthText.replace("px", ""));
                        System.out.println(width + "*" + height);

                        primaryStage.setWidth(width);
                        primaryStage.setHeight(height);
                    }
                }
            });
            webEngine.load("http://www.baidu.com/");
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

我想在加载后调整 primaryStage 的大小。但最后,我得到的大小是 586*586,primaryStage 显示如下: enter image description here

其实我不想要滚动样式,那如何去掉滚动条呢?如果我一开始用primaryStage.setWidth()或者primaryStage.setHeight()primaryStage的尺寸设置的很大,滚动条就不存在了。但这不是我需要的,我想动态调整大小,因为 url 会改变。

【问题讨论】:

    标签: javafx


    【解决方案1】:

    这类似于RKJ给出的解决方案(依赖于查询WebView的文档宽度和高度)。

    这个解决方案增加了一些东西:

    1. completely remove WebView scroll bars at all times 的能力(您可能希望也可能不希望这样做,因为如果用户手动缩小窗口,它会阻止用户滚动大文档或查看完整文档)。
    2. 调用 stage.sizeToScene() 以根据场景大小精确调整舞台大小。

    由于 WebView 的一些实现细节,这个解决方案的行为有点奇怪。 WebView 不会加载文档,除非它显示在舞台上,因此您无法知道文档大小,直到您尝试显示它。因此,您需要显示文档,然后调整舞台大小以适合文档,这会导致在最初显示舞台之后以及调整大小以完全适合文档时出现延迟。这为某些文档提供了舞台大小的可见跳跃,看起来很奇怪。此外,大于屏幕大小的文档(在网络上很常见)也无法完整显示,因为舞台只能最大程度地调整大小以填充可用的屏幕空间,并且没有任何滚动条,您将看不到文档的一部分。所以总而言之,我不认为这个解决方案真的有用。

    no-overflow.css

    body {
        overflow-x: hidden;
        overflow-y: hidden;
    }
    

    WebViewTest.java

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
    
    public class WebViewTest extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            final WebView view = new WebView();
            view.getEngine().setUserStyleSheetLocation(
                    getClass().getResource("no-overflow.css").toExternalForm()
            );
            final WebEngine webEngine = view.getEngine();
    
            webEngine.getLoadWorker().runningProperty().addListener((observable, oldValue, newValue) -> {
                System.out.println("Running: " + newValue);
                if (!newValue) {
                    String heightText = webEngine.executeScript(
                            "document.height"
                    ).toString();
                    double height = Double.valueOf(heightText.replace("px", ""));
    
                    String widthText = webEngine.executeScript(
                            "document.width"
                    ).toString();
                    double width = Double.valueOf(widthText.replace("px", ""));
                    System.out.println(width + "*" + height);
    
                    view.setMinSize(width, height);
                    view.setPrefSize(width, height);
                    view.setMaxSize(width, height);
    
                    stage.sizeToScene();
    
                    System.out.println(view.getLayoutBounds());
                }
            });
    
            webEngine.load("http://www.baidu.com");
    
            Scene scene = new Scene(view);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

      【解决方案2】:

      公共类 WebViewTest 扩展应用程序 {

      @Override
      public void start(Stage primaryStage) throws Exception {
      
       final WebView view = new WebView();
          final WebEngine webEngine = view.getEngine();
      
      
          Scene scene = new Scene(view, 600, 600);
          primaryStage.setScene(scene);
          primaryStage.show();
      
          Platform.runLater(() -> {
              webEngine.getLoadWorker().progressProperty().addListener(new ChangeListener<Number>() {
                  @Override
                  public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                      if (newValue.doubleValue() == 1D) {
                          String heightText = webEngine.executeScript("document.height").toString();
                          double height = Double.valueOf(heightText.replace("px", ""));
      
                          String widthText = webEngine.executeScript("document.width").toString();
                          double width = Double.valueOf(widthText.replace("px", ""));
      
                          System.out.println(width + "*" + height);
      
                          primaryStage.setWidth(width+50);
                          primaryStage.setHeight(height+50);
      
                          primaryStage.hide(); 
                          primaryStage.show();
                      }
                  }
              });
              webEngine.load("http://baidu.com/");
          });
      }
      
      public static void main(String[] args) {
          launch(args);
      }
      

      }

      使用 document.height 和 document.width 来获取实际尺寸,像素大小和舞台尺寸测量值之间存在细微差别,所以我额外添加了 50 个像素并隐藏舞台并再次显示它,但如果您在 StackPane 容器中使用 WebView。 rkjoshi

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 2016-12-13
        • 1970-01-01
        • 2014-08-04
        • 2021-07-21
        • 2013-07-22
        • 1970-01-01
        相关资源
        最近更新 更多