Я понимаю, что это на самом деле старый вопрос, но он занимает 2 место в одном из моих поисках чего-то еще, и я думаю, что ниже, может помочь кому-то еще, что это находит.
Я недавно сделал что-то подобное, благодаря чему Java-аплету нужно было перезвонить в JavaScript по завершении задачи, вызвав различные функции при успешном выполнении или ошибке. Как и в последнее время, мои потребности заключались в анонимных функциях, определяемых как параметры, передаваемые другим функциям. Это Javascript на стороне клиента:
applet.DoProcessing({
success: function(param) {
alert('Success: ' + param);
},
error: function(param) {
alert('Failed: ' + param);
}
});
Как уже упоминалось в других ответах, Java может вызвать только на методы JavaScript по имени. Это означает, что вам нужен глобальный метод обратного вызова, который затем может вызывать другие методы, как это необходимо:
function ProcessingCallback(isSuccessful, cbParam, jsObject) {
if (isSuccessful && jsObject.success)
jsObject.success(cbParam);
else if (!isSuccessful && jsObject.error)
jsObject.error(cbParam);
}
Эта функция вызывается непосредственно из 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});
}
Вы могли бы провести на ссылка на объект параметра передается неограниченно, если вы хотите использовать его как некоторая форма зарегистрированного обратного вызова, а не как однократная, если это необходимо и т. д.
В нашем случае обработка может быть временной интенсивной, поэтому мы фактически вращаем еще один поток - cal lbacks еще здесь работает также:
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();
}
кажется, что вы можете передать функции Java по имени, поэтому то, что вам нужно сделать, это создать объект фасада, который будет обернуть апплет и который будет принимать ссылки функции и придумайте временные имена для них. – w00t 2011-08-04 04:44:15