# JxBrowser-demo **Repository Path**: javacoo/jx-browser-demo ## Basic Information - **Project Name**: JxBrowser-demo - **Description**: JxBrowser-demo - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 7 - **Created**: 2020-09-21 - **Last Updated**: 2024-10-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JxBrowser-demo #### 介绍 JxBrowser-demo JxBrowser是一个跨平台的Java库,允许将基于Google Chromium的Web浏览器组件集成到Java Swing / AWT / JavaFX应用程序中。使用JxBrowser,您可以将轻量级Swing / JavaFX组件嵌入到Java应用程序中,以显示现代网页,支持最新的Web标准,如HTML5,CSS3,JavaScript等 #### 软件架构 软件架构说明 为什么选用JxBrowser? BS结构的优点在于,软件维护和升级方便,只要能上网就能升级了且在很多地方都能够直接使用软件,而不需要安装,前提要能登陆到服务器。 CS结构缺乏通用性,具有较大的局限性,维护和管理的难度大,但是CS结构的交互性强,而且使用CS能与本地的硬件进行交互(如小票打印机、银联pos机、钱箱等……) 虽然BS结构有诸多优点,但当遇到需要与硬件进行交互时,并不能完全满足业务需求,故而采用了BS+CS结合的方式,希望能同时具有CS结构的交互性与BS的灵活性,使用JxBrowser后,客户端相当于一个带有谷歌浏览器内核的定制浏览器,负责与硬件(如打印机、钱箱、POS机等)的交互,同时负责业务网页的显示,而业务的处理仍是在服务端后台。 软件的版本迭代是怎么处理的? 客户端的jar包采用第三方插件FxLauncher,在打包时,Fxlauncher会生成一个固定格式的app.xml,app.xml文件中记录了代码的线上地址、每个jar包详情等信息;在客户端启动时,FxLauncher会将本地的app.xml与线上的进行比较,若文件列表中有文件发生变化,则对该文件进行下载覆盖。 其它的文件,如调用银联pos所需的dll文件等,则有自己编写的下载更新模块进行下载与安装 #### 安装教程 6.18版本下载: https://jxbrowser.support.teamdev.com/support/discussions/topics/9000039314 #### 使用说明 JxBrowser怎么使用? JxBrowser的下载 https://jxbrowser.support.teamdev.com/support/discussions/forums/9000110576 jxbrowser的破解 (注:破解仅用于技术交流,如有需要还是购买正版的好#手动捂脸) 在jxbrowser的启动类中加入如下代码: ``` static { try { Class claz = null; //6.5.1版本破解 兼容xp claz = Class.forName("com.teamdev.jxbrowser.chromium.aq"); //6.21版本破解 默认使用最新的6.21版本 // claz = Class.forName("com.teamdev.jxbrowser.chromium.ba"); Field e = claz.getDeclaredField("e"); Field f = claz.getDeclaredField("f"); e.setAccessible(true); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); modifersField.setAccessible(true); modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL); modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); e.set(null, new BigInteger("1")); f.set(null, new BigInteger("1")); modifersField.setAccessible(false); } catch (Exception e) { e.printStackTrace(); logger.error("执行jxbrowser破解程序时出现异常"+LoggerUtil.getErrorMessage(e)); } } ``` 在resources资源文件夹中创建文件夹META-INF,在META-INF文件夹下创建teamdev.licenses文件,将下列信息复制到文件中 ``` Product: JxBrowser Version: 6.x Licensed to: License type: Enterprise License info: JxBrowser License Expiration date: 01-01-9999 Support expiration date: NO SUPPORT Generation date: 01-01-1970 Platforms: win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64 Company name: TeamDev Ltd. SigB: 1 SigA: 1 ``` OK,破解好了,到此就可以正常使用了 jxbrowser的6.5.1是最后的支持XP系统的版本,6.21为我下载时的最新版本,根据具体需求选择版本,jxbrowser支持windows、mac、linux,并且都有对应的jar包,jxbrowser.jar为核心jar包,其它的可以根据需求选择性的引入。 3. 通过JxBrowser实现js与java代码进行交互 JxBrowser为Browser对象提供了丰富的监听器,要实现js与java代码的交互,只需在监听器中添加创建对象的代码,window是前端中的window对象,这里是通过jxbrowser浏览器获取到window对象,并对该对象扩展了一个名为jsEntity的对象。当然,JsEntity为自定义的一个实体类,需自行创建,创建对象是为了供前端js调用,而后端调用js,直接使用browser.executeJavaScript()即可,传入方法名与参数 ``` browser.addLoadListener(new LoadAdapter() { @Override public void onFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent) { super.onFinishLoadingFrame(finishLoadingEvent); JSValue window = browser.executeJavaScriptAndReturnValue("window"); //给jswindows对象添加一个扩展的属性 JsEntity jsEntity = new JsEntity(); window.asObject().setProperty("jsEntity", jsEntity); //调用前端页面js browser.executeJavaScript("alert('我是后台,我调用了js!')"); } }); ``` 这里我选择的是加载事件的监听器,加载事件的监听器中有几个方法: ``` @Override public void onStartLoadingFrame(StartLoadingEvent startLoadingEvent) { super.onStartLoadingFrame(startLoadingEvent); } @Override public void onProvisionalLoadingFrame(ProvisionalLoadingEvent provisionalLoadingEvent) { super.onProvisionalLoadingFrame(provisionalLoadingEvent); } @Override public void onFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent) { super.onFinishLoadingFrame(finishLoadingEvent); } @Override public void onFailLoadingFrame(FailLoadingEvent failLoadingEvent) { super.onFailLoadingFrame(failLoadingEvent); } @Override public void onDocumentLoadedInFrame(FrameLoadEvent frameLoadEvent) { super.onDocumentLoadedInFrame(frameLoadEvent); } @Override public void onDocumentLoadedInMainFrame(LoadEvent loadEvent) { super.onDocumentLoadedInMainFrame(loadEvent); } ``` 从方法名上很容易能看出来分别是重写了什么事件,只需对需要的方法进行重写即可。 前端js代码: ```$js js调用java ``` JsEntity实体类的代码: ``` public class JsEntity { public String toTest(String str){ System.out.println(str); return "I'm ok,真的ok,thank you"; } } ``` 在客户端启动时,浏览器加载完毕后,会弹出“我是后台,我调用了js!”,点击事件发生后,后台会输出被js调用的信息,而同时,浏览器会弹窗“I'm ok,真的ok,thank you”,如果要实现js调用硬件,只需在自定义的实体类中添加java调用硬件的代码即可 到此结束! #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)