远方蔚蓝
一刹那情真,相逢不如不见

文章数量 126

访问次数 199827

运行天数 1437

最近活跃 2024-10-04 23:36:48

进入后台管理系统

JavaFx与JavaScript交互


package demo;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/**
 * H5调用测试
 * @author wst 2024116日 下午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 2024116日 下午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 2024116日 下午1:56:33
 *
 */
public class JavaScriptObject {
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	/**
	 * 开给js调用的方法 驱动调用
	 * @author wst 2024117日 上午9:44:52
	 * @param orgs
	 * @return
	 */
	public String jsCallDrive(String org) {
		logger.info("驱动调用 org: {}", org);
		return org;
	}
	
	/**
	 * 开放给js调用的方法
	 * @author wst 2024117日 上午10:10:37
	 * @param org
	 * @return
	 */
	public String jsReturn(String org) {
		logger.info("驱动调用 org: {}", org);
		return org;
	}
	
	/**
	 * 设置传给js的参数
	 * @author wst 2024117日 上午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>