WebView 是一個可以嵌入網頁瀏覽功能的元件,使用內建的 WebKit 引擎來顯示 HTML 內容(包括 JavaScript、CSS 等)。這對於桌面應用程式需要嵌入網頁內容(如:顯示文件、使用 Web UI 元件)時非常有用。
但該 WebKit engine 不是最新版本,雖然支援 html5/css/javascript,但不支援新的標準,不支援多個分頁,沒有 js console 開發者工具,無法使用 react/vue 這些框架,不能跟 javafx node 直接互動(無法將 node 插入 html DOM)。
webview 裡面的頁面跟 js,可以跟 java code 互動
以下是一個雙向互動的 sample
js 可可
package javafx.webview;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
public class WebViewDemo extends Application {
@Override
public void start(Stage primaryStage) {
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
// 載入 HTML 字串
String html = """
<html>
<head>
<script>
function callJava() {
javaApp.showMessage("Hello from JavaScript!");
}
function fromJava(data) {
document.getElementById("result").innerText = "Java says: " + data;
}
</script>
</head>
<body>
<h2>JavaFX WebView 雙向互動</h2>
<button onclick="callJava()">呼叫 Java 方法</button>
<p id="result"></p>
</body>
</html>
""";
webEngine.loadContent(html);
// 頁面載入完成後建立 bridge
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaApp", new JavaBridge(webEngine));
}
});
BorderPane root = new BorderPane(webView);
Scene scene = new Scene(root, 800, 600);
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX WebView 雙向互動範例");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
// Java Bridge 類別
public static class JavaBridge {
private final WebEngine webEngine;
public JavaBridge(WebEngine webEngine) {
this.webEngine = webEngine;
}
// JS 呼叫這個方法
public void showMessage(String msg) {
System.out.println("JavaScript 傳來訊息: " + msg);
// Java 反呼叫 JS 的 function
webEngine.executeScript("fromJava('收到: " + msg + "')");
}
}
}
沒有留言:
張貼留言