Je sais que c'est un vraiment vieille question, mais il se classait 2e dans l'une de mes recherches pour quelque chose d'autre, et je pense que le ci-dessous peut aider quelqu'un d'autre qui trouve cela.
J'ai récemment fait quelque chose de similaire, par lequel une applet Java doit rappeler en JavaScript à la fin d'une tâche, appelant différentes fonctions en cas de succès ou d'erreur. Comme cela a été le cas ces derniers temps, mes besoins consistaient à appeler des fonctions anonymes définies comme des paramètres transmis à d'autres fonctions. Ceci est le javascript sur le côté client:
applet.DoProcessing({
success: function(param) {
alert('Success: ' + param);
},
error: function(param) {
alert('Failed: ' + param);
}
});
Comme mentionné dans les autres réponses, Java ne peut appeler les méthodes JavaScript par son nom. Cela signifie que vous avez besoin d'une méthode de rappel global, qui peut ensuite appeler à d'autres méthodes comme il le faut:
function ProcessingCallback(isSuccessful, cbParam, jsObject) {
if (isSuccessful && jsObject.success)
jsObject.success(cbParam);
else if (!isSuccessful && jsObject.error)
jsObject.error(cbParam);
}
Cette fonction est appelée directement à partir de l'applet Java:
public void DoProcessing(final Object callbacks) {
//do processing....
JSObject w = JSObject.getWindow(this);
//Call our named callback, note how we pass the callbacks parameter straight
//back out again - it will be unchanged in javascript.
w.call("ProcessingCallback", new Object[]{successful, output, callbacks});
}
Vous pouvez tenir la référence de l'objet paramètre étant transmise indéfiniment si vous souhaitez l'utiliser comme une forme de rappel enregistré plutôt que comme un rappel si nécessaire, etc.
Dans notre cas, le traitement peut être intensif en temps, donc nous tournons réellement un autre fil - le cal lbacks travaillent encore ici aussi:
public void DoProcessing(final Object callbacks) {
//hold a reference for use in the thread
final Applet app = this;
//Create a new Thread object to run our request asynchronously
//so we can return back to single threaded javascript immediately
Thread async = new Thread() {
//Thread objects need a run method
public void run() {
//do processing....
JSObject w = JSObject.getWindow(app);
//Call our named callback, note how we pass the callbacks parameter
//straight back out again - it will be unchanged in javascript.
w.call("ProcessingCallback", new Object[]{successful, output, callbacks});
}
}
//start the thread
async.start();
}
Il semble que vous ne pouvez passer des fonctions Java par nom, donc ce que vous devez faire est de créer un objet de façade qui enveloppait l'applet et qui prendrait des références de fonction et trouver des noms temporaires pour eux. – w00t