第二篇:封装控件并实现js与java的相互通讯
上一篇:使用javafx2搭建简单客户端嵌入浏览器项目(一)
新建一个WebViewHelp.java
package sample.JSBridge;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import netscape.javascript.JSException;
import sample.Json.EJsonType;
import sample.Json.GsonHelp;
import sample.Utils.StringUtlis;
public class WebViewHelp {
private WebView webView;
private WebEngine webEngine;
public WebViewHelp(WebView webView) {
this.webView = webView;
this.webEngine = webView.getEngine();
// 此处注册一个事件该事件是javafx提供
webEngine.setOnAlert((WebEvent<String> event) -> {
LoadMethod(event.getData());
});
}
/**
* 加载本地路径
* @param path
*/
public void LoadFile(String path) {
if (StringUtlis.IsNull(path))
return ;
if(path.contains("file:///")){
webEngine.load(path);
} else {
String url = String.format("%1$s:///%2$s","file", path);
webEngine.load(url);
}
}
/**
* 加载网络路径
* @param path
*/
public void LoadHttp(String path) {
if (StringUtlis.IsNull(path))
return ;
if(path.contains("http://") || path.contains("https://")){
webEngine.load(path);
} else {
webEngine.load(String.format("%1$s:///%2$s","https", path));
}
}
/**
* js触发加载本地方法
* @param data
*/
private void LoadMethod(String data) {
String port = GsonHelp.GetJsonValue("port", data, EJsonType.STRING);
String returnData = RuntimeReflectasm.MethodCall(
GsonHelp.GetJsonValue("className", data, EJsonType.STRING),
GsonHelp.GetJsonValue("method", data, EJsonType.STRING),
GsonHelp.GetJsonValue("params", data, EJsonType.JSON_OBJ));
try{
webEngine.executeScript("JSBridge.onFinish(" + port + ",'" + returnData + "')");
} catch (JSException e) {
System.out.println("js异常:"+e.getMessage());
}
}
}
这里使用了gson.jar和Reflectasm库,调用如下
@FXML
private void initialize() {
webViewHelp = new WebViewHelp(webView);
webViewHelp.LoadFile("D:\\testxxxxxxxxx\\test.html");
}
总结:
第一次接触javafx打算做一个使用web技术做桌面应用的框架,其中的部分提供参考与思路,如果觉得有更好的思路与建议欢迎提供,对了千万不要说java不适合做客户端。