I'm на самом деле не кодирование в Java, но JRuby. Чтобы сделать пример Java , мне придется упростить мой код ниже. Может быть, это может помочь некоторым. Если нет, Я попытаюсь сделать пример Java.
# Function f1 will call the callback methods cb1 and cb2 with 'this' variable
# This is just a notation for creating javascript function. It calls
# @browser.executeJavaScriptAndReturnValue(scrpt), whith the function
# body (everything between EOT) modified to make a valid javascript script.
# f1 is a function with 2 arguments cb1, and cb2 which should be the
# callback functions
f1 = B.function(<<-EOT)
(cb1, cb2) {
cb1.call(this, "banana", "milk");
cb2.call(this, "arroz", "feijao");
}
EOT
# Proc is a closure. It receives two arguments |food1, food2|. This will
# become a java object per JRuby´s magic
proc = Proc.new { |food1, food2| puts "I hate #{food1} and #{food2}" }
# now call method f1 passing proc as the first argument and the block as
# the second argument. So cb1 = proc and cb2 = <the block bellow>. Method
# 'send' grabs the given arguments, converts them to java objects and then
# calls jxBrowser 'invoke' method with the given arguments.
f1.send(proc) { |food1, food2| puts "eu gosto de #{food1} e #{food2}" }
Результат выполнения этого кода:
I hate banana and milk
eu gosto de arroz e feijao
Как можно видеть, «это» переменная просто ушла ... Я хотел бы иметь возможность захват «это «переменная как-то, чтобы иметь возможность использовать контекст в блоках. Мне удалось создать обходное решение, позволяющее захватывать «эту» переменную, но требует обертывания блока в другой функции javascript.
Вся идея этого кода заключается в том, чтобы позволить разработчику JRuby написать Ruby-код и получить этот код в jxBrowser без необходимости использования какого-либо javascript. Примеры этого уже можно увидеть, загрузив GEM mdarray-sol или перейдя на https://github.com/rbotafogo/mdarray-sol. Там вы можете увидеть несколько примеров использования d3.js с JRuby.
Не могли бы вы укажите код Java класса с помощью метода callback(). – Vladimir
Мне не удалось добавить пример кода в этот комментарий, поэтому я добавлю в качестве ответа на вопрос ниже ... –