2012-04-05 10 views
3

私はJavaで書かれたクラスライブラリを持っており、Javascriptに変換したいと思っています。すべてのメソッドはかなりシンプルで、主にコレクションの操作と関係しています。私はこの1つのクラス、GameControlをインスタンス化することができ、そのメソッドをページ上の他のJavaScriptコードに公開したいと思います。GWTのクラス機能を公開するには

私は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 = [email protected]::_gameControl; 
    }-*/; 

} 

GameControl.javaは

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

ので、GWTは確かにコードをコンパイルし、私は、$wnd.gameに組み込まれているGameControl_0オブジェクトがあることを知っていますが、見つけられる方法はありません。isEmpty()

私の最終的な結果はのインスタンスとしてwindow.gameとなり、すべての公開メソッドGameControlが公開されています。

どうすればいいですか? windowプロパティを公開するJSNIを使って@jusioの回答を1として

編集 は、明示的に働いていたが、それはあまりにも冗長でした。私は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)エクスポートされません。

答えて

6

GameControlのインスタンスのみが公開されています。他のメソッドを公開したい場合は、それらも公開する必要があります。たとえば :

public native void expose()/*-{ 
     var control = [email protected]::_gameControl; 
     var gameInstance = { 
      gameControl: control, 
      isEmpty:function(param){ 
       [email protected]::isEmpty(*)(param); 
      } 

     } 


     $wnd.game = gameInstance; 
    }-*/; 

はまた、それはあなたが

+0

申し訳ありませんが受け入れ中です。最初の解決策は機能しましたが、実際は非常に冗長です。私はgwt-exporterが働くようには思えない。私はそれを外部JARとしてプロジェクトに追加し、 'GameEntryPoint' XMLモジュールファイルを' org.timepedia.exporter.Exporter'から継承するように修正し、 'export'値を' yes'に設定し、最後に '私のプロジェクトのすべてのクラスにエクスポート可能なインターフェイスがありますが、まだGWTコンパイルはコードを生成しません。私は '@ Export'アノテーションをいくつか追加しようとしました。私が何をするかも知っていますか? – Yuval

+0

@Yuvalまた、あなたがエントリーポイントのどこかでExporterUtil.exportAll();を呼び出さなければならないので、フレームワークはクラスを実際に公開します。 – jusio

+0

これを追加しても何も変わりません。おそらくgwt-exporterは私のコードを処理している間にエラーに陥っていますか?それが働いている間、gwt-exporterが働くのを見る方法はありますか? – Yuval

関連する問題