JavaFX:how to resize the stage when using webview

依然范特西╮ 提交于 2021-02-11 09:58:13

问题


for example:

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

I want to resize the primaryStage after loading. But finally, I get the size is 586*586, and the primaryStage shows like this: enter image description here

Actually, I don't want the rolling style, so how can I remove the scroll bar? If I use primaryStage.setWidth() or primaryStage.setHeight() to set the size of primaryStage very big at the beginning, the scroll bar will not exist. But that not I need, I want to resize the size dynamically, because the url will change.


回答1:


This is similar to the solution given by RKJ (relies on querying WebView for the document width and height).

This solution adds a couple of things:

  1. Ability to completely remove WebView scroll bars at all times (you may or may not want this as it stops the user being able to scroll large documents or view complete documents if the user manually makes the window smaller).
  2. A call to stage.sizeToScene() to size the stage precisely to the scene size.

The behavior of this solution is kind of weird due to some implementation details of WebView. WebView does not load the document unless it is displayed on the stage, so you can't know the document size until you try to display it. So you need to display the document, then resize the stage to fit the document, which results in a delay after the stage has been initially shown and when it resizes to exactly fit the document. This provides, for certain documents, a visible jump in the stage size which just looks weird. Also documents larger than the screen size (which are common on the web) cannot be displayed in full as the stage can only maximally resize to fill the available screen real estate and without any scroll bars you can't see part of the document. So in all, I don't think this solution is really useful.

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:


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("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);
}

}

use document.height and document.width to get the actual dimension, there is slight difference between the pixel size and stage size measurement so, I added 50 pixel extra and hide the stage and show it again but it is more better if you use WebView inside StackPane Container. rkjoshi



来源:https://stackoverflow.com/questions/42505876/javafxhow-to-resize-the-stage-when-using-webview

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!