J'ai une bibliothèque de classes écrite en Java et je veux la convertir en Javascript. Toutes les méthodes sont assez simples et ont principalement trait à la manipulation de collections. J'ai cette classe unique, GameControl, que je pourrais créer une instanciation et je veux que ses méthodes soient exposées à un autre code Javascript sur la page.
Je pensais utiliser GWT. J'ai un projet en cours d'exécution dans GWT qui compile, mais je ne peux pas comprendre comment exposer mon instance (+ fonctionnalité) de la classe GameControl.
Je pensais que l'utilisation de JSNI pour exposer mon objet devrait fonctionner, mais ce n'était pas le cas. Voici la version courte de la façon dont il ressemble maintenant:
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; } }
Donc, GWT compile le code, et je vois qu'il existe un objet GameControl_0
cours de construction et mis en $wnd.game
, mais aucune méthode isEmpty()
n'est trouvée.
Mon résultat final attendu est d'avoir une window.game
comme une instance de GameControl
avec toutes les méthodes publiques GameControl
expose.
Comment puis-je faire ceci?
Modifier Selon la réponse de @jusio, l'utilisation de JSNI pour exposer window
propriétés de la window
explicitement fonctionnée, mais elle était trop verbose. J'essaie la solution gwt-exportator. Maintenant j'ai
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; } }
Mais aucun code n'est exporté (spécifiquement pas RoadServer
).
Vous n'avez exposé que l'instance de GameControl
. Si vous souhaitez exposer d'autres méthodes, vous devrez les exposer également. Par exemple:
public native void expose()/*-{ var control = [email protected]::_gameControl; var gameInstance = { gameControl: control, isEmpty:function(param){ [email protected]::isEmpty(*)(param); } } $wnd.game = gameInstance; }-*/;
De plus, il existe un cadre appelé gwt-exporter , cela pourrait vous faciliter les choses