Поскольку вам нужно ClickEvent
для перехода к ClickHandler.onClick
и получения его из JavaScript, возникает проблема (AFAICT) - я бы выбрал немного другой, более «общий» подход:
Создание простого интерфейса обратного вызова:
public interface Callback {
void execute();
}
Затем вы можете передать его напрямую и назвать его так:
public native void addClickHandler(Callback callback) /*-{
addEventListener('click', function() {
callback.@path.to.your.package.Callback::execute()();
}, false);
}-*/;
Или создайте промежуточный шаг:
public void addClickHandler(Callback callback) {
_addClickHandler(getCallback(callback));
}
private native void _addClickHandler(JavaScriptObject callback) /*-{
addEventListener('click', callback, false);
}-*/;
// This can be moved to a better place
private native static JavaScriptObject getCallback(Callback callback) /*-{
return function()
{
callback.@path.to.your.package.Callback::execute()();
};
}-*/;
И, конечно, вы бы использовали это так:
SVGRect svg = getMeSVGRect();
svg.addClickHandler(new Callback() {
@Override
public void execute() {
// Do some stuff
}
});
Лично я предпочитаю второе решение - хотя это больше кода, мне нравится сохранять свои собственные методы / JSNI закрытыми (если это не объект наложения или что-то подобное), а код более читабелен и менее подвержен ошибкам (нет необходимости использовать прикольный синтаксис для вызова функций Java из собственного кода / JSNI).