从 javascript 到 java(GWT 故事)

发布于 2024-12-21 13:59:48 字数 766 浏览 2 评论 0原文

因此,我正在 GWT 中为嵌入式 Web 浏览器 (Sketchup) 设计一个应用程序。我可以通过将 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 设置某种异步回调接口机制(以某种方式)

So, I'm designing an app in GWT for an embedded web browser (Sketchup). I can control Sketchup by changing the window.location value to "skp::myFunciton@myParams". Sketchup can execute javascript in the browser. What I want to do is ask sketchup to give me the contents of its model.

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

After a second sketchup has a result. But how do we get it back to gwt? The problem is the entrypoint instance launched the request and JSNI can only map static methods to javascript.

I thought I had a solution with events and elements...

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

and then listening for the change in GWT. Alas, it doesn't work. Gwt's own event system overrides, sinks, deters (or whatever) the event. What approach should I take? I've been through the web in search of info but I certainly can't get my head round it. I'm guessing the answer is either...

1 Call an entrypoint instance method from javascript (somehow)
2 Fire an event from javascript that will be picked up by gwt (somehow)
3 Setup an async callback interface mechanism of sorts (somehow)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

安稳善良 2024-12-28 13:59:48

界面应该非常简单。

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

    public static native void executeFunctionWithCallBack(MyCallback callback)/*-{
           var callBackWrapper =function(param) {
              [email protected]::onSuccess(*)(param);
           } 
           $wnd.invokeFunctionWithCallback(callbackWrapper)  
     }-*/;

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

Interface should be pretty simple.

For example, let's say we have some object in GWT. Let's say we have some function in JS which accept some callback as parameter. So in gwt we will have something like this:

    public static native void executeFunctionWithCallBack(MyCallback callback)/*-{
           var callBackWrapper =function(param) {
              [email protected]::onSuccess(*)(param);
           } 
           $wnd.invokeFunctionWithCallback(callbackWrapper)  
     }-*/;

If you want to call instance methods, you need to expose not only method, but instance on which it should be called as well. E.g. you have to pass an instance as parameter to the JSNI method (or obtain it from JSNI in some other way). Then you create a JS function which will invoke method on instance. That's all. No more magic=)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文