2012-04-05 4 views
3

Ich habe eine Klassenbibliothek in Java geschrieben und möchte es in Javascript konvertieren. Alle Methoden sind ziemlich einfach und haben hauptsächlich mit der Manipulation von Sammlungen zu tun. Ich habe diese eine Klasse, GameControl, die ich instanziieren konnte und ich möchte, dass ihre Methoden anderen Javascript-Codes auf der Seite zugänglich gemacht werden.Wie Klassenfunktionalität in GWT offengelegt werden

Ich dachte, GWT zu verwenden. Ich habe ein laufendes Projekt in GWT, das kompiliert, aber ich kann nicht herausfinden, wie meine Instanz (+ Funktionalität) der GameControl-Klasse verfügbar gemacht werden soll.

Ich dachte mit JSNI mein Objekt zu belichten sollte funktionieren, aber es nicht. Dies ist die kurze Version, wie es aussehen jetzt wie:

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; 
    } 
} 

So GWT stellt in der Tat den Code, und Ich sehe, dass ein GameControl_0 Objekt gebaut und in $wnd.game gesetzt wird, aber keine isEmpty() Methode gefunden werden.

Mein erwartetes Endergebnis ist ein window.game als eine Instanz von GameControl mit allen öffentlichen Methoden GameControl ausgesetzt ist.

Wie kann ich das tun?

bearbeiten Per @jusio ‚s Antwort, JSNI mit window Eigenschaften belichten explizit gearbeitet, aber es war zu ausführlich. Ich versuche die gwt-exporteur-Lösung. Jetzt habe ich

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; 
    } 
} 

aber noch kein Code ausgeführt wird (insbesondere nicht RoadServer).

Antwort

6

Sie haben nur die Instanz GameControl freigelegt. Wenn Sie andere Methoden verfügbar machen möchten, müssen Sie sie ebenfalls verfügbar machen. Zum Beispiel:

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

     } 


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

Auch gibt es einen Rahmen gwt-exporter genannt, könnte es die Dinge einfacher für Sie

+0

Entschuldigung für die Verzögerung bei der Annahme. Die erste Lösung funktionierte, aber es ist in der Tat sehr ausführlich. Ich kann nicht scheinen, "gwt-exporter" zu arbeiten. Ich habe es als externe JAR zum Projekt hinzugefügt, die 'GameEntryPoint' XML-Moduldatei so modifiziert, dass sie von' org.timepedia.exporter.Exporter' übernommen wurde und den 'export'-Wert auf' yes' gesetzt und schließlich den '' hinzugefügt Exportierbare Schnittstelle zu jeder Klasse in meinem Projekt, aber eine GWT-Kompilierung erzeugt keinen Code.Ich habe auch versucht, einige @ Export-Anmerkungen hinzuzufügen. Hast du eine Idee, was ich tun könnte? – Yuval

+0

@Yuval Sie müssen auch 'ExporterUtil.exportAll();' irgendwo in Ihrem Einstiegspunkt aufrufen, damit das Framework Ihre Klassen tatsächlich freilegt. – jusio

+0

Nichts hat sich geändert, nachdem ich das hinzugefügt habe; Vielleicht wird der gwt-exporter bei der Verarbeitung meines Codes mit einem Fehler konfrontiert? Gibt es eine Möglichkeit, den gwt-exporteur während der Arbeit zu sehen? – Yuval