如何在GWT中公开类功能

How to expose class functionality in GWT

本文关键字:功能 GWT      更新时间:2023-09-26

我有一个用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出口商解决方案。现在我有

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)。

您只公开了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的框架,它可能会让变得更容易

这可能会有所帮助。

http://code.google.com/p/gwtchismes/wiki/Tutorial_ExportingGwtLibrariesToJavascript_en