2012-04-05 2 views
3

Java로 작성된 클래스 라이브러리가 있고 Javascript로 변환하려고합니다. 모든 메소드는 매우 간단하며 주로 콜렉션을 조작해야합니다. 이 클래스를 인스턴스화 할 수있는 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는 실제로 코드를 컴파일하고, GameControl_0 개체가 생성되어 $wnd.game에 설정되어 있지만 어떤 방법도 찾을 수 없다는 것을 알았습니다.

내 예상 최종 결과는 의 인스턴스로 window.game이되며 모든 공개 메서드는 GameControl 노출입니다.

어떻게하면됩니까? window 속성을 노출하는 JSNI를 사용하여 @jusio의 응답으로 당

편집 는 명시 적으로 일했다,하지만 너무 자세한이었다. 나는 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

관련 문제