2015-10-18 84 views
3

傳遞字符串列表作爲參數傳遞給javascript函數我有一個JavaScript函數:從本地Java代碼

drawPath: function drawPathFn(nodeList){ 
     console.log(""+nodeList[1]); 
}, 

,並調用此函數的本地Java代碼:

List<String> nodes = getShortestPath(s, d); 
architectView.callJavascript("World.drawPath('"+nodes+"')"); 

節點列表中充滿了幾個位置名稱,但是當我嘗試將此列表傳遞給javascript函數時,控制檯輸出僅爲:「[」代表console.log(""+nodeList[0]);,「S」代表console.log(""+nodeList[1]);

我想要的是當我調用nodeList [0]時,我希望它打印出例如「建築A」。 我怎麼能做到這一點?

+0

我不熟悉Java,但對我來說,看起來很奇怪你可以將List連接到一個String而不會發生編譯錯誤。除此之外,它在我看來,你傳遞給'drawPathFn'的是你的Java'節點'的toString'd結果。 – 76484

+0

是的你是對的,但我沒有使用toString函數或任何東西。即使我只在nodes.get(0)列表中發送一個項目,它仍然表現相同。 – user997248

+0

如果您希望JavaScript將您的項目作爲數組處理,那麼它必須像數組一樣構造。 '「World.drawPath([」+ String.join(「,」,nodes)+「]);」); – 76484

回答

0

您需要在JavaScript中傳遞JSObject或字符串作爲文字數組,即"['str0','str1']"。 下面介紹如何使用JSObject:

//first we need an Iterator to iterate through the list 
java.util.Iterator it = nodes.getIterator(); 
//we'll need the 'window' object to eval a js array, you may change this 
//I dont know if you are using an applet or a javaFX app. 
netscape.javascript.JSObject jsArray = netscape.javascript.JSObject.getWindow(YourAppletInstance).eval("new Array()"); 
//now populate the array 
int index = 0; 
while(it.hasNext()){ 
    jsArray.setSlot(index, (String)it.next()); 
    index++; 
} 
//finaly call your function 
netscape.javascript.JSObject.getWindow(YourAppletInstance).call("World.drawPath",new Object[]{jsArray}); 

下面介紹如何用文字字符串做:

java.util.Iterator it = nodes.getIterator(); 
int index = 0; 
String literalJsArr = "["; 
//populate the string with 'elem' and put a comma (,) after every element except the last 
while(it.hasNext()){ 
    literalJsArr += "'"+(String)it.next()+"'"; 
    if(it.hasNext()) literalJsArr += ","; 
    index++; 
} 
literalJsArr += "]"; 
architectView.callJavascript("World.drawPath("+literalJsArr+")"); 

參考:

http://www.oracle.com/webfolder/technetwork/java/plugin2/liveconnect/jsobject-javadoc/netscape/javascript/JSObject.html https://docs.oracle.com/javase/tutorial/deployment/applet/invokingJavaScriptFromApplet.html

+0

用一個字符串來完成它。謝謝丹尼爾。 – user997248