JavaFX:如何在使用webview时调整舞台大小

时间:2017-02-28 10:13:45

标签: javafx

例如:

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的大小设置为非常大,则滚动条将不存在。但这不是我需要的,我想动态调整大小,因为网址会改变。

2 个答案:

答案 0 :(得分:0)

公共类WebViewTest扩展了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("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 Container中使用WebView。 rkjoshi

答案 1 :(得分:0)

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

此解决方案增加了一些内容:

  1. 能够completely remove WebView scroll bars at all times(您可能会也可能不想这样,因为如果用户手动使窗口变小,它会阻止用户滚动大型文档或查看完整文档。)
  2. 致电stage.sizeToScene(),将舞台尺寸精确调整为场景尺寸。
  3. 由于WebView的一些实现细节,此解决方案的行为有点奇怪。除非在舞台上显示文档,否则WebView不会加载文档,因此在尝试显示文档之前,您无法知道文档大小。因此,您需要显示文档,然后调整舞台大小以适合文档,这会在最初显示舞台后以及调整大小以适合文档时导致延迟。对于某些文档,这为舞台大小提供了可见的跳跃,这看起来很奇怪。此外,大于屏幕尺寸的文档(在网络上很常见)无法完整显示,因为舞台只能最大限度地调整大小以填充可用的屏幕空间,并且没有任何滚动条,您无法看到文档的一部分。总而言之,我不认为这个解决方案真的很有用。

    oops

    无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);
        }
    }