例如:
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
的大小设置为非常大,则滚动条将不存在。但这不是我需要的,我想动态调整大小,因为网址会改变。
答案 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的文档宽度和高度)。
此解决方案增加了一些内容:
stage.sizeToScene()
,将舞台尺寸精确调整为场景尺寸。由于WebView的一些实现细节,此解决方案的行为有点奇怪。除非在舞台上显示文档,否则WebView不会加载文档,因此在尝试显示文档之前,您无法知道文档大小。因此,您需要显示文档,然后调整舞台大小以适合文档,这会在最初显示舞台后以及调整大小以适合文档时导致延迟。对于某些文档,这为舞台大小提供了可见的跳跃,这看起来很奇怪。此外,大于屏幕尺寸的文档(在网络上很常见)无法完整显示,因为舞台只能最大限度地调整大小以填充可用的屏幕空间,并且没有任何滚动条,您无法看到文档的一部分。总而言之,我不认为这个解决方案真的很有用。
无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);
}
}