Q:JxBrowser是什么?
- JxBrowser是一个跨平台的Java库,允许将基于Google Chromium的Web浏览器组件集成到Java Swing / AWT / JavaFX应用程序中。使用JxBrowser,您可以将轻量级Swing / JavaFX组件嵌入到Java应用程序中,以显示现代网页,支持最新的Web标准,如HTML5,CSS3,JavaScript等。
Q:为什么选用JxBrowser?
- BS结构的优点在于,软件维护和升级方便,只要能上网就能升级了且在很多地方都能够直接使用软件,而不需要安装,前提要能登陆到服务器。
- CS结构缺乏通用性,具有较大的局限性,维护和管理的难度大,但是CS结构的交互性强,而且使用CS能与本地的硬件进行交互(如小票打印机、银联pos机、钱箱等……)
- 虽然BS结构有诸多优点,但当遇到需要与硬件进行交互时,并不能完全满足业务需求,故而采用了BS+CS结合的方式,希望能同时具有CS结构的交互性与BS的灵活性,使用JxBrowser后,客户端相当于一个带有谷歌浏览器内核的定制浏览器,负责与硬件(如打印机、钱箱、POS机等)的交互,同时负责业务网页的显示,而业务的处理仍是在服务端后台。
Q:软件的版本迭代是怎么处理的?
- 客户端的jar包采用第三方插件FxLauncher,在打包时,Fxlauncher会生成一个固定格式的app.xml,app.xml文件中记录了代码的线上地址、每个jar包详情等信息;在客户端启动时,FxLauncher会将本地的app.xml与线上的进行比较,若文件列表中有文件发生变化,则对该文件进行下载覆盖。
- 其它的文件,如调用银联pos所需的dll文件等,则有自己编写的下载更新模块进行下载与安装
Q:JxBrowser怎么使用?
- JxBrowser的下载
https://jxbrowser.support.teamdev.com/support/discussions/forums/ - 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资源文件夹中创建文件夹MATA-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,激活成功教程好了,到此就可以正常使用了
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调用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调用硬件的代码即可
到此结束!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198916.html原文链接:https://javaforall.net
