📅  最后修改于: 2023-12-03 14:42:22.344000             🧑  作者: Mango
JavaFX 的 WebView 类提供了一个嵌入式的 Web 浏览器,能够在 JavaFX 应用程序中渲染 HTML 内容。它实现了 Webkit2 浏览器引擎,支持基本的 HTML5 和 CSS3 特性,并且能够通过 JavaScript 向 Java 应用程序发送通信请求。
以下是一个简单的 JavaFX 应用程序,它使用 WebView 类加载并渲染指定的 URL。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewExample extends Application {
@Override
public void start(Stage stage) {
WebView webView = new WebView(); //创建WebView对象
webView.getEngine().load("https://www.google.com"); //加载指定的URL
Scene scene = new Scene(new StackPane(webView), 640, 480); //创建场景
stage.setScene(scene); //设置场景
stage.show(); //展示窗口
}
public static void main(String[] args) {
launch(args);
}
}
除了加载远程 URL,WebView 也能够加载本地的 HTML 文件。下面的示例演示了如何加载并渲染一个本地的 HTML 文件。
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewExample extends Application {
@Override
public void start(Stage stage) throws MalformedURLException {
WebView webView = new WebView();
URL url = new File("index.html").toURI().toURL(); //将本地的HTML文件转换为URL类型
webView.getEngine().load(url.toString()); //加载指定的本地文件
Scene scene = new Scene(new StackPane(webView), 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
WebView 类还提供了一个强大的 JavaScript 执行引擎,可以让 JavaFX 应用程序和 JavaScript 代码直接进行双向通信。下面是一个简单的样例,演示了如何通过 JavaScript 代码向 Java 应用程序发送消息。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
public class WebViewExample extends Application {
@Override
public void start(Stage stage) {
WebView webView = new WebView();
webView.getEngine().loadContent("<html><body><button onclick=\"sendToJava()\">发送消息到 Java</button></body><script>function sendToJava() { window.java.send('Hello from JavaScript!'); }</script></html>");
webView.setContextMenuEnabled(false);
webView.getEngine().setOnAlert(event -> {
System.out.println("Received message from JavaScript: " + event.getData());
});
webView.getEngine().getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
if (newValue == Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webView.getEngine().executeScript("window");
window.setMember("java", new JavaBridge());
}
});
Scene scene = new Scene(new StackPane(webView), 640, 480);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
public static class JavaBridge {
public void send(String message) {
System.out.println("Received message from JavaScript: " + message);
}
}
}
在这个例子中,我们定义了一个名为 “java” 的变量,并将一个名为JavaBridge的Java对象附加到该变量上。我们在 JavaScript 中调用名为“发送消息到Java”的函数,该函数将一个字符串消息发送到 JavaBridge 对象的 send 方法中。同时,JavaBridge 对象中的 send 方法将字符串消息输出到控制台。