📜  JavaFX | WebView 类(1)

📅  最后修改于: 2023-12-03 14:42:22.344000             🧑  作者: Mango

JavaFX | WebView 类

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);
    }
}
加载本地 HTML 文件

除了加载远程 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);
    }
}
和 JavaScript 的交互

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 方法将字符串消息输出到控制台。