package demo;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/**
* H5调用测试
* @author wst 2024年1月16日 下午1:55:55
* java --module-path javaFx的安装目录/lib --add-modules javafx.controls,javafx.web -jar H5WebViewDemo-0.0.1-SNAPSHOT.jar
* javafx.controls,javafx.web为javaFx的安装目录/lib里面的依赖jar包名称
*/
public class H5WebViewDemo extends Application {
@Override
public void start(Stage stage) {
Rectangle2D screenRectangle = Screen.getPrimary().getBounds();
double width = screenRectangle.getWidth();
double height = screenRectangle.getHeight();
stage.setTitle("H5WebViewDemo");
stage.setMaximized(false); // 最大化
stage.setResizable(false); // 不可缩放
stage.initStyle(StageStyle.UNDECORATED);//设定窗口无边框
stage.setScene(new Scene(new Browser(stage), width - 50, height - 50, Color.web("#666970")));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
- 浏览器webview的封装
package demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.control.Alert;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
/**
* WebView的封装
*
* @author wst 2024年1月16日 下午1:57:11
*
*/
@SuppressWarnings("restriction")
public class Browser extends Region {
private Logger logger = LoggerFactory.getLogger(this.getClass());
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public Browser(final Stage stage) {
logger.info("WebView初始化");
getStyleClass().add("browser");
webEngine.getLoadWorker().stateProperty()
.addListener((ObservableValue<? extends State> ov, State oldState, State newState) -> {
if (newState == State.SUCCEEDED) {
// 设置H5中调用java的对象
// 如果调用java中的jsCallDrive方法:window.external.jsCallDrive
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("external", new JavaScriptObject());
win.setMember("sout", System.out);
// 需要执行网页的jsSetData(xml方法)
webEngine.executeScript("jsSetData('" + JavaScriptObject.jsSetData() + "')");
}
});
// 用于监听js中的alert对话框内容
browser.getEngine().setOnAlert(e -> {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("提示");
alert.setHeaderText("");
alert.setContentText(e.getData());
alert.showAndWait();
});
// 设置主页
webEngine.load(H5WebViewDemo.class.getResource("jszkat.html").toExternalForm());
// 载入webview
getChildren().add(browser);
logger.info("WebView装载完成");
}
@Override
protected void layoutChildren() {
layoutInArea(browser, 0, 0, getBoundsInParent().getWidth(), getBoundsInParent().getHeight(), 0, HPos.CENTER, VPos.CENTER);
}
}
- 封装提供给前端调用的方法
package demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 提供H5调用的接口
*
* @author wst 2024年1月16日 下午1:56:33
*
*/
public class JavaScriptObject {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 开给js调用的方法 驱动调用
* @author wst 2024年1月17日 上午9:44:52
* @param orgs
* @return
*/
public String jsCallDrive(String org) {
logger.info("驱动调用 org: {}", org);
return org;
}
/**
* 开放给js调用的方法
* @author wst 2024年1月17日 上午10:10:37
* @param org
* @return
*/
public String jsReturn(String org) {
logger.info("驱动调用 org: {}", org);
return org;
}
/**
* 设置传给js的参数
* @author wst 2024年1月17日 上午9:58:45
* @return
*/
public static String jsSetData() {
return "xxxxxxx";
}
}
- H5页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<title>H5</title>
<script language="JavaScript" type="">
function onLoad(){
alert("运行环境:" + navigator.userAgent.toLowerCase());
}
//接收java传入的参数
function jsSetData(xml){
alert(xml);
}
//调用驱动
function jsCallDrive(){
window.external.jsCallDrive(s);
}
function jsReturn(){
window.external.jsReturn(s);
}
</script>
</html>