JxBrowser概述与简单应用

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/9000110576

jxbrowser的破解

(注:破解仅用于技术交流,如有需要还是购买正版的好#手动捂脸)

在jxbrowser的启动类中加入如下代码:

static{try{ Class claz =null;//6.5.1版本破解 兼容xpclaz = 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,newBigInteger("1")); f.set(null,newBigInteger("1")); modifersField.setAccessible(false); }catch(Exception e) { e.printStackTrace(); logger.error("执行jxbrowser破解程序时出现异常"+LoggerUtil.getErrorMessage(e)); } }

在resources资源文件夹中创建文件夹META-INF,在META-INF文件夹下创建teamdev.licenses文件,将下列信息复制到文件中

Product:JxBrowserVersion:6.xLicensedto:Licensetype:EnterpriseLicenseinfo:JxBrowser LicenseExpirationdate:01-01-9999Support expirationdate:NO SUPPORTGenerationdate:01-01-1970Platforms:win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64Companyname:TeamDev Ltd.SigB:1SigA:1

OK,破解好了,到此就可以正常使用了

jxbrowser的6.5.1是最后的支持XP系统的版本,6.21为我下载时的最新版本,根据具体需求选择版本,jxbrowser支持windows、mac、linux,并且都有对应的jar包,jxbrowser.jar为核心jar包,其它的可以根据需求选择性的引入。

通过JxBrowser实现js与java代码进行交互

JxBrowser为Browser对象提供了丰富的监听器,要实现js与java代码的交互,只需在监听器中添加创建对象的代码,window是前端中的window对象,这里是通过jxbrowser浏览器获取到window对象,并对该对象扩展了一个名为jsEntity的对象。当然,JsEntity为自定义的一个实体类,需自行创建,创建对象是为了供前端js调用,而后端调用js,直接使用browser.executeJavaScript()即可,传入方法名与参数

browser.addLoadListener(newLoadAdapter() {@OverridepublicvoidonFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent){super.onFinishLoadingFrame(finishLoadingEvent); JSValue window = browser.executeJavaScriptAndReturnValue("window");//给jswindows对象添加一个扩展的属性JsEntity jsEntity =newJsEntity(); window.asObject().setProperty("jsEntity", jsEntity);//调用前端页面jsbrowser.executeJavaScript("alert('我是后台,我调用了js!')"); } });

这里我选择的是加载事件的监听器,加载事件的监听器中有几个方法:

@OverridepublicvoidonStartLoadingFrame(StartLoadingEvent startLoadingEvent){super.onStartLoadingFrame(startLoadingEvent); }@OverridepublicvoidonProvisionalLoadingFrame(ProvisionalLoadingEvent provisionalLoadingEvent){super.onProvisionalLoadingFrame(provisionalLoadingEvent); }@OverridepublicvoidonFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent){super.onFinishLoadingFrame(finishLoadingEvent); }@OverridepublicvoidonFailLoadingFrame(FailLoadingEvent failLoadingEvent){super.onFailLoadingFrame(failLoadingEvent); }@OverridepublicvoidonDocumentLoadedInFrame(FrameLoadEvent frameLoadEvent){super.onDocumentLoadedInFrame(frameLoadEvent); }@OverridepublicvoidonDocumentLoadedInMainFrame(LoadEvent loadEvent){super.onDocumentLoadedInMainFrame(loadEvent); }

从方法名上很容易能看出来分别是重写了什么事件,只需对需要的方法进行重写即可。

前端js代码:

functionjsToJava(){try{varres = jsEntity.toTest('我是js,我来调用java了'); alert(res); }catch(e){ alert(e); } }js调用java

JsEntity实体类的代码:

publicclassJsEntity{publicStringtoTest(String str){ System.out.println(str);return"I'm ok,真的ok,thank you"; }}

在客户端启动时,浏览器加载完毕后,会弹出“我是后台,我调用了js!”,点击事件发生后,后台会输出被js调用的信息,而同时,浏览器会弹窗“I'm ok,真的ok,thank you”,如果要实现js调用硬件,只需在自定义的实体类中添加java调用硬件的代码即可

到此结束!

欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:828697593

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

哦对了,喜欢就别忘了关注一下哦~

转载于:https://blog.51cto.com/14080124/2325020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的达内Java培训经历

我当时2009年参加达内培训是在学校里,达内与我们学校合作。当时培训班只开了一个班,有位班主任,因为是第一届,学生也少,不到20个,所以不是老师现场教的,看视频学习的,视频是录播的。班主任负责培训班日常管理工作,和技术答疑。培训视频是投影仪放。当时培训java基础的…

小米大数据:借助Apache Kylin打造高效、易用的一站式OLAP解决方案

如今的小米不仅是一家手机公司,更是一家大数据与人工智能公司。随着小米公司各项业务的快速发展,数据中的商业价值也愈发突显。而与此同时,各业务团队在数据查询、分析等方面的压力同样正在剧增。因此,为帮助公司各业务线解决这些…

旧电脑升级Win11

2014年的联想Y430P升级成功 升级很简单 第一步:下载win11系统安装包,下载地址:系统之家 - Win11系统 第二步:下载KMS激活工具,下载地址:https://www.jb51.net/softs/668522.htmlhttps://www.jb51.net/sof…

进程池的用法

apply() 函数原型: apply(func[, args()[, kwds{}]]) 该函数用于传递不定参数,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现)。 apply_async() 函数原型: apply_async(func[, args()[, …

巧删无法删除的文件

遇到无法删除的文件,电脑上没有文件粉碎工具,或文件粉碎工具也删不掉,怎么办? 很简单: 把文件的后缀名改掉,比如改成doc,重启电脑,再删除

万用表测线路断点位置_如何测出电线电缆断点在哪?来看看常见的7种方法

实际工程维护检修中,对于维修人员来说最怕的莫过于碰到电线电缆中间断了找不出断点在什么地方。虽然我们弱电工程实际维修的时候,碰到线缆问题会直接想办法换线或者重新敷设,但是我们今天讨论技术上有哪些方法可以测出线缆的断点!…

12.04个人博客

地点:自习室 事件:召开小组会议,进项任务分配转载于:https://www.cnblogs.com/qingjia/p/10145891.html

你真的会用OneNote吗?

你真的会用OneNote吗?_程序媛一枚-CSDN博客前言特色功能图片转文字TAB制表符新建表格表格嵌套自动编号保存微信文稿树形目录基本功能总结前言使用OneNote做笔记已经有一年多的时间了,从最开始的抵触,到现在的习惯,心态的转变主要是…

乐学python_铁乐学python_day01-作业

第一题:使用while循环输入 1 2 3 4 5 6 8 9 10# 使用while循环输入 1 2 3 4 5 6 8 9 10count 0while (True) :count count 1#判断当count等于7的时候,返回循环最初,不执行下面的打印等语句if count 7:continueprint (count)#判断当count等…

大道至简: 拉新、促活和留存

互联网运营中的拉新、促活和留存思维,从来不局限于互联网产品里,在传统行业里也是通用的,比如一家理发店的经营也是如此。 互联网运营中的拉新、促活和留存思维,从来不局限于互联网产品里,在传统行业里也是通用的。比如…

python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?

关于InnoDB索引,我们可能知道InnDB索引是用B树实现的,而B树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B树?常见优化查询速度数据结构哈希表哈…

数据仓如何支撑应用?

数据仓支撑应用,主要有以下步骤: 1.应用部门:在“宁波市公共数据目录平台”按需申请省市共享数据,申请的表审批通过后,提交《审批通过的表清单》给大数据中心; 2.大数据中心:比对《审批通过的…

辛苦俩月总结的面试题,掌握它怼翻面试官不是梦~

小编经过一个多月的不懈努力,给大家总结了一份面试方面的题目。这份面试题涉及高并发、分布式、高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的 Offer!因为是笔试题目,大家可以先做。如果需要查看答案&…

python坐标转化极坐标_python 坐标系

广告关闭提供包括云服务器,云数据库在内的50款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。写在前面的话01 今天资源君带大家学习一下python的可视化,何谓可视化呢? 我们常常听说python的数据分析&#…

百家号 不被推荐,原因:将旧闻冒充新闻发布,请修改后重新发布

1.情景展示 在百家号进行创作的作者,发布文章时,难免会遇到审核不通过,下面说一下其中一种情况: 不被推荐,原因:将旧闻冒充新闻发布,请修改后重新发布. 2.解决方案 出现这种情况,原…

java字符串常量池——字符串==比较的一个误区

转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用比较并不相等。 例如: var obj {}; var obj2 {}; console.log(obj obj2); // 结果为false json在js中代表…

java注解_Java注解教程及自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。Java1.5引入了注解,当前许多java框架中大量使用注解…

Git设置忽略eclipse配置文件

概述 eclipse的配置文件是不能公用的,不同电脑上的eclipse配置文件内容是不一样的,如果将eclipse配置文件上传到了git,其他开发下载后,导入项目,有些报错就是因为配置文件关系 操作 在git的忽略文件“.gitignore”里…

MySQL 时间函数

A. timestampdiff() 传三个参数,第一个时间类型如年,月,日,第二个开始时间,第三个结束时间select test_name, timestampdiff(YEAR,create_time,end_time) y_date from test_table; --计算时间 -------------------| te…