JxBrowser-JS与JAVA代码交互及碰到的问题

JS和Java交互可以说是软件的灵魂,JxBrowser调用Java方法很简单。参照官方Demo:

browser.addScriptContextListener(new ScriptContextAdapter() {
    @Override
    public void onScriptContextCreated(ScriptContextEvent event) {
        Browser browser = event.getBrowser();
        JSValue window = browser.executeJavaScriptAndReturnValue("window");
        window.asObject().setProperty("java", new JavaObject());
    }
});

这样你就可以使用Js随意调用Java类的方法和属性了,非常方便。ScriptContextAdapter用于接收JavaScript上下文事件,在页面JS脚本初始化和销毁时调用。

 

注意:Java方法的返回值是Java对象,不能像处理js对象那样去调用,而要以调用Java方法的形式去调用。比如你返回了一个 List<String>给js,你在js代码中想获取这个List的长度,用length是不行的,而要用size()。

public List<String> test(){...}

var list=Test.test();

错误:alert(list.length);

正确:alert(list.size());

建议在Java方法中把返回值转换成Json字符串再返回给Js,再在Js中JSON.parse(xx)将字符串转换成Js对象。

在js里面写java代码,看上去虽然很牛批,可能过段时间回过头来一看:这写的是什么鬼?混着写也容易写着写着把自己写懵了,不知道自己写的是js还是java。

不要尝试在js代码打印Java类对象。比如你加入了一个Java类对象:jsObject.setProperty("Test",new xxxx()); ,再执行如下js代码:alert(Test); 或者 console.log(Test);  效果自测。

 

根据Demo实现JS调用Java对象后,为了可以自动注入指定的Java类对象,不用每加一个Java类都去写一个 jsObject.setProperty(xxx,xxx)方法,我自定义了JsClass注解,采用了注解的方式去扫描所有包含JsClass注解的类,自动加载。

有个问题,我们一般会在 $(document).ready(function(){});里面调用Java方法初始化一些数据。在初始化时偶尔会抛出 XXX无效的错误,明明已经用setProperty设置了 XXX,可就是找不到。有时又不会报这个错。这个问题多出现在第一次启动软件时。(电脑配置越好,碰到的几率越小)

这里我推测是jsObject.setProperty和document加载是同步进行的。能找到是因为JAVA对象在document.ready()之前将Java对象加入了上下文。但大多数情况下,Java对象载入没这么快。官方文档说:如果您先注入/注册Java对象,再加载网页,则所有注册的Java对象将被破坏,并且无法在加载的网页的JavaScript中使用。

多次测试发现,第一个载入的 Java对象大概率不会出现无效的问题。所以建议只载入一个Java对象。

这里推荐两个方案:

1.只载入一个Java对象,Java对象的代码尽量简单。(说实话,这方案只能降低碰到JAVA对象未定义的几率,程序启动稍微一卡就找不到Java对象)【这里有个馊主意,如果Java对象未定义,重载页面】

2.不使用document.ready()这样的方法,定义一个公共的js函数,在网页框架加载完成后用Java调用。(没试,感觉可行)

方法总比问题多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值