que dan cuenta de esto es una realidad vieja pregunta, pero el puesto 2 en una de mis búsquedas para otra cosa, y creo que el siguiente puede ayudar a otra persona que se encuentra presente.
Recientemente he hecho algo similar por el cual un applet de Java necesita volver a llamar a JavaScript al completar una tarea, llamando a diferentes funciones por éxito o error. Como ha sido la tendencia en los últimos tiempos, mis necesidades eran llamar a funciones anónimas definidas como parámetros pasados a otras funciones. Este es el javascript en el lado del cliente:
applet.DoProcessing({
success: function(param) {
alert('Success: ' + param);
},
error: function(param) {
alert('Failed: ' + param);
}
});
Como se menciona en las otras respuestas, Java solo puede llamar a los métodos de JavaScript por su nombre. Esto significa que necesita un método de devolución de llamada global, que luego puede llamar a otros métodos como se da el caso:
function ProcessingCallback(isSuccessful, cbParam, jsObject) {
if (isSuccessful && jsObject.success)
jsObject.success(cbParam);
else if (!isSuccessful && jsObject.error)
jsObject.error(cbParam);
}
Esta función se llama directamente desde el applet de 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});
}
Usted podría mantenerse en el la referencia del objeto de parámetro que se pasa indefinidamente si desea utilizarlo como una forma de devolución de llamada registrada en lugar de uno desechable si es necesario, etc.
En nuestro caso, el procesamiento puede ser muy intenso, así que realmente giramos otro hilo: el cal lbacks todavía trabajan aquí también:
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();
}
Parece que sólo se puede pasar a las funciones de Java por su nombre, por lo tanto, lo que se necesita hacer es crear un objeto de fachada que envuelva el applet y que tendría referencias de las funciones y proponer nombres temporales para ellos. – w00t