【问题标题】:How to expose class functionality in GWT如何在 GWT 中公开类功能
【发布时间】:2012-04-19 06:07:33
【问题描述】:

我有一个用 Java 编写的类库,想将其转换为 Javascript。所有方法都非常简单,主要与操作集合有关。我有一个类 GameControl,我可以对其进行实例化,并且我希望它的方法暴露给页面上的其他 Javascript 代码。

我想使用 GWT。我在 GWT 中有一个正在运行的项目,它可以编译,但我不知道如何公开我的 GameControl 类的实例(+功能)。

我认为使用 JSNI 公开我的对象应该可以工作,但它没有。这是它现在的样子的简短版本:

GameEntryPoint.java

import com.google.gwt.core.client.EntryPoint;

public class GameEntryPoint implements EntryPoint {

    private GameControl _gameControl;

    @Override
    public void onModuleLoad() {
        _gameControl = new GameControl();
        expose();
    }


    public native void expose()/*-{
        $wnd.game = this.@game.client.GameEntryPoint::_gameControl;
    }-*/;

}

GameControl.java

package game.client;
public class GameControl {
    public boolean isEmpty(int id){
        // does stuff...
        return true;
    }   
}

所以,GWT 确实编译了代码,我看到有一个GameControl_0 对象正在构建并设置到$wnd.game,但没有找到isEmpty() 方法。

我预期的最终结果是有一个window.game 作为GameControl 的一个实例,所有公共方法GameControl 都暴露了。

我该怎么做?

编辑 根据@jusio 的回复,使用JSNI 公开window 属性明确有效,但它太冗长了。我正在尝试 gwt-exporter 解决方案。现在我有

GameEntryPoint.java

package game.client;

import org.timepedia.exporter.client.ExporterUtil;
import com.google.gwt.core.client.EntryPoint;

public class GameEntryPoint implements EntryPoint {

    @Override
    public void onModuleLoad() {
        ExporterUtil.exportAll();
    }

}

RoadServer.java

package game.client;

import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;


@ExportPackage("game")
@Export("RoadServer")
public class RoadServer implements Exportable {
    int _index;
    int _id;
    public RoadServer(int index,int id){
        this._id=id;
        this._index=index;
    }
}

但仍然没有导出任何代码(特别是RoadServer)。

【问题讨论】:

    标签: javascript gwt code-generation


    【解决方案1】:

    您只公开了GameControl 的实例。如果你想公开其他方法,你也必须公开它们。 例如:

     public native void expose()/*-{
            var control = this.@game.client.GameEntryPoint::_gameControl;   
            var gameInstance = {
                gameControl: control,
                isEmpty:function(param){
                  control.@game.client.GameEntryPoint::isEmpty(*)(param);   
                }  
    
            }
    
    
            $wnd.game = gameInstance;
        }-*/;
    

    还有一个名为 gwt-exporter 的框架,它可能会让你更轻松

    【讨论】:

    • 很抱歉延迟接受。第一个解决方案有效,但确实非常冗长。我似乎无法让gwt-exporter 工作。我已将其作为外部 JAR 添加到项目中,修改了 GameEntryPoint XML 模块文件以继承自 org.timepedia.exporter.Exporter 并将 export 值设置为 yes,最后将 Exportable 接口添加到每个类在我的项目中,但 GWT 编译仍然不会产生任何代码。我还尝试向某些添加 @Export 注释。知道我可以做什么吗?
    • @Yuval 您还必须在入口点的某处调用ExporterUtil.exportAll();,因此框架实际上会公开您的类
    • 我添加后没有任何变化;也许 gwt-exporter 在处理我的代码时遇到错误?有什么方法可以让我看到 gwt-exporter 在工作时工作?
    • 如果它没有抛出任何错误,它应该可以工作。您如何尝试访问导出的类?
    • 我在 JS 代码中查找它,包括 game.GameEntryPoint.nocache.js 和任一排列(例如 FE9DCF0DDC60172C41317F311A73B456.cache.html)。没有任何课程。
    【解决方案2】:
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多