2011-09-06 96 views
4

首先調用Java方法,是的,我已經搜查,發現了這個答案已經:從GWT JSNI

GWT JSNI - problem passing Strings

我試圖調用從JSNI方法的Java方法,但不是任何地方獲得。我已經嘗試了上面給出的建議,但它仍然行不通。

下面的代碼:

public native void initCustomListeners(MapmakerMapViewPresenter.MyView view) /*-{ 
//public native void initCustomListeners() /*-{ 

    $wnd.getLocationDescriptions = function(lng, lat) { 
     $entry([email protected]::getLocationDescriptions(DD)(lng, lat)); 
    } 

    $wnd.google.maps.event.addListener(map, 'click', function(event) { 
     var lat = event.latLng.lat().toFixed(3); 
     var lng = event.latLng.lng().toFixed(3); 
     alert("(" + lat + ", " + lng + ")"); 
     $wnd.getLocationDescriptions(lng, lat); 

     alert("Test!"); 
    }); 
}-*/; @Override 
public void getLocationDescriptions(double lng, double lat) { 
    getUiHandlers().doGetLocationDescriptions(lng, lat); 
} 

誰能幫助我嗎?

傑森

回答

3

我不知道這是個問題(你甚至不說,代碼的行爲對你如何指望它來表現),但也有代碼中的一些錯誤:

  • $entry包裝一個函數,所以你必須調用它返回的函數,而不是(無用地)在調用它後包裝函數的結果! 也就是說$entry(function(lat,lng) { [email protected]::quux(DD)(a, b); }而不是$entry([email protected]::quux(DD)(a, b))

  • addListenermap但從來沒有定義的變量。

+0

我仍然錯過了一些東西......你能看到我最近的帖子嗎? – Jason

+0

我認爲在我建議使用'$ entry()'的時候出現了一個錯誤,請看更新後的答案 –

+0

它試圖調用這個方法,但拋出一個ClassCastException。alert()表明我按照需要傳遞了一個double,但是找出正在嘗試傳輸的Class並不重要。 – Jason

0

我仍然缺少一些東西,並且我盯着給定的代碼很長一段時間。

下面的代碼的當前版本:

public native void initCustomListeners(JavaScriptObject map) /*-{ 

    var that = this; 

    $wnd.getLocationDescriptions = function(lng, lat) { 
     $entry([email protected]er::doGetLocationDescriptions(DD))(lng,lat); 
    } 

    $wnd.google.maps.event.addListener(map, 'click', function(event) { 
     var lat = event.latLng.lat(); 
     var lng = event.latLng.lng(); 
     alert("(" + lat + ", " + lng + ")"); 
     @com.google.gwt.core.client.GWT::log(Ljava/lang/String;)("calling $wnd.getLocationDescriptions()"); 
     $wnd.getLocationDescriptions(lng, lat); 
     @com.google.gwt.core.client.GWT::log(Ljava/lang/String;)("called $wnd.getLocationDescriptions()"); 
    }); 
}-*/; 

該呼叫導致一個ClassCastException。對不起,如果我錯過了應該是顯而易見的東西。

0

一個錯誤,我可以看到的是,你應該做的:

$wnd.getLocationDescriptions = $entry(@org.jason.mapmaker.client.view.MapmakerMapViewImpl::getLocationDescriptions(DD)(lng, lat)); 

(不與功能「包裝」您使用),然後通過從JavaScript調用該函數:

$wnd.getLocationDescriptions(lng, lat); 

另外,在@之前,'that'變量不是必需的(或'this')。我也不能確定$ wnd.google.maps.event.addListener(的東西,你肯定有這樣的分配上$ WND對象

最後,需要多一個看看這個:

https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI