5

因此,我正在为嵌入式 Web 浏览器 (Sketchup) 设计一个 GWT 应用程序。我可以通过将 window.location 值更改为“skp::myFunciton@myParams”来控制 Sketchup。Sketchup 可以在浏览器中执行 javascript。我想做的是让sketchup给我它模型的内容。

public static native void getModel() /*-{
    $wnd.location = "skp:getModel@";
}-*/;

在第二个草图后有结果。但是我们如何让它回到 gwt 呢?问题是入口点实例发起了请求,而 JSNI 只能将静态方法映射到 javascript。

我以为我有一个包含事件和元素的解决方案......

//Sketchup javascript
var gwtwidget = document.getElementById("myTextArea")
gwtwidget.value = "blahblah";
gwtwidget.onchange();

然后监听 GWT 的变化。唉,它不起作用。Gwt 自己的事件系统覆盖、接收、阻止(或其他)事件。我应该采取什么方法?我一直在网上搜索信息,但我当然无法理解它。我猜答案是……

1 从 javascript 调用一个入口点实例方法(不知何故)
2 从 javascript 触发一个事件,该事件将由 gwt 拾取(不知何故)
3 设置各种异步回调接口机制(不知何故)

4

1 回答 1

7

界面应该很简单。

例如,假设我们在 GWT 中有一些对象。假设我们在 JS 中有一些函数,它接受一些回调作为参数。所以在 gwt 中我们会有这样的东西:

    public static native void executeFunctionWithCallBack(MyCallback callback)/*-{
           var callBackWrapper =function(param) {
              callback.@com.package.MyObject::onSuccess(*)(param);
           } 
           $wnd.invokeFunctionWithCallback(callbackWrapper)  
     }-*/;

如果要调用实例方法,则不仅需要公开方法,还需要公开应该调用它的实例。例如,您必须将实例作为参数传递给 JSNI 方法(或以其他方式从 JSNI 获取)。然后创建一个 JS 函数,它将调用实例上的方法。就这样。没有更多的魔法=)

于 2011-12-15T21:55:55.533 回答