gpt4 book ai didi

java - 将 ClickHandler 与 native Javascript 对象一起使用?

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:40 24 4
gpt4 key购买 nike

在 Javascript 中,我正在制作一个 SVG 形状并向其添加一个点击处理程序,如下所示:

  var rect = document.createElementNS('http://www.w3.org/2000/svg','rect');
rect.addEventListener('click', myClickHandler, false);

这很好用。我正在尝试在 GWT 中创建一个覆盖 Rect 类。如果可能的话,我想简单地做这样的事情:

public class SVGRect extends JavaScriptObject {

public native void addClickHandler(ClickHandler handler) /*-{
addEventListener('click', handler, false);
}-*/;
}

这样我就可以将“普通”GWT 处理程序传递给此类,并从外部将其用作任何其他普通 GWT UI 元素。我不确定如何将 ClickHandler 对象连接到该对象的 native javascript 实现?

谢谢

最佳答案

因为您需要一个 ClickEvent 传递给 ClickHandler.onClick 并且从 JavaScript 获取它会带来问题(AFAICT)- 我会选择一个稍微不同的,更多“通用”方法:

创建一个简单的回调接口(interface):

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
}
});

就个人而言,我更喜欢第二种解决方案 - 虽然它有更多代码,但我喜欢将我的 native /JSNI 方法保持私有(private)(除非它是一个覆盖对象或类似的东西)并且代码更易读且更不容易出错(不需要使用时髦的语法从 native /JSNI 代码中调用 Java 函数)。

关于java - 将 ClickHandler 与 native Javascript 对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2130716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com