如何从主应用程序中检测JavaFX WebView上的点击?

时间:2015-12-30 07:02:17

标签: scala javafx webview event-handling

目前,我通过向HTML内容添加Javascript事件处理程序来执行此操作,该内容根据所单击的项目设置全局变量:

<script>
  var clicked="";
</script>

<span onmousedown="clicked='me';">me</span>

然后从主应用程序中我在webview的鼠标单击处理程序中查询此变量的内容:

webview.setOnMouseClicked(new EventHandler[MouseEvent]{
  def handle(mouseEvent:MouseEvent){
    if(mouseEvent.getEventType().toString()=="MOUSE_CLICKED"){

       val clicked=webview.executeScript("clicked").toString()

}}})

这恰好工作但感觉就像是黑客。 webview是否有合法的方式可以请求应用程序根据单击的元素刷新其内容?

1 个答案:

答案 0 :(得分:1)

由于我不了解Scala,我只能为您提供Java方法,但您可能会弄清楚如何将其转换为Scala。 在Java(或您的Scala)代码和JavaScript之间注册一个桥梁。 Oracle的this article描述了基础知识。页面中的JavaScript可以调用应用程序,通知它单击了某个按钮:

public class MyBridge {
  public void callbackFromJavaScript(String what) {
     ...
  }
}

JSObject jsobj = (JSObject) webEngine.executeScript("window");
jsobj.setMember("java", new MyBridge());

然后,您可以在单击元素并执行callbackFromJavaScript时进行调用:

<span onmousedown="java.callbackFromJavaScript('me');">me</span>

您可以从callbackFromJavaScript轻松调用JavaScript函数并传递一个对象(例如JSON),JS函数将更新页面,或者您可以加载完全不同的内容。