2015-10-18 2 views
3

J'ai une fonction javascript:Le passage d'une liste de chaînes comme argument à la fonction javascript à partir du code Java natif

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

et le code Java natif qui appelle cette fonction est:

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

nœuds liste est rempli avec plusieurs noms de lieux, mais quand je tente de passer cette liste à la fonction javascript, la sortie de la console est juste: "[" pour console.log(""+nodeList[0]); et "S" pour console.log(""+nodeList[1]);

Ce que je veux, c'est que lorsque j'appelle nodeList [0], je veux qu'il imprime par exemple. "Construire un". Comment pourrais-je y parvenir?

+0

Je ne suis pas au courant Java, mais il me semble très étrange que vous puissiez concaténer une liste sur une chaîne sans avoir d'erreur de compilation. Cela mis à part, il me semble que ce que vous passez à 'drawPathFn' est le résultat toString'd de vos' nodes' Java. – 76484

+0

Oui, vous avez raison, mais je n'utilise pas la fonction toString ou quoi que ce soit. Même si j'envoie seulement un élément dans la liste comme nodes.get (0) il se comporte toujours de la même façon. – user997248

+0

Si vous voulez que JavaScript traite votre article comme un tableau, il doit être structuré comme un tableau. '" World.drawPath (["+ String.join (", ", nodes) +"]); "); – 76484

Répondre

0

Vous devez transmettre un JSObject ou une chaîne en tant que tableau littéral en javascript, c'est-à-dire "['str0','str1']". Voici comment utiliser un 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}); 

Voici comment le faire avec une chaîne littérale:

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+")"); 

Référence:

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

Fait avec une chaîne littérale. Merci Daniel. – user997248