Javascript 处理点击GWT FlowPanel的方法是什么
这可能是个愚蠢的问题,但GWT FlowPanel(原始Javascript 处理点击GWT FlowPanel的方法是什么,javascript,gwt,dom-events,Javascript,Gwt,Dom Events,这可能是个愚蠢的问题,但GWT FlowPanel(原始div元素)没有提供处理鼠标点击/鼠标移动的功能。重写onBrowserEvent也不起作用 如果使用本机JavaScript设置onclick事件(如果未指定,'div'的高度为0),则捕获这些事件工作正常。有没有不使用JSNI的方法可以做到这一点?似乎这个问题很愚蠢,是的FlowPanel可以很容易地包装或替换为FocusPanel,它提供了许多监视/处理事件的方法。这里需要做的是将FlowPanel包装在FocusPanel中。Foc
div
元素)没有提供处理鼠标点击/鼠标移动的功能。重写onBrowserEvent也不起作用
如果使用本机JavaScript设置
onclick
事件(如果未指定,'div'的高度为0
),则捕获这些事件工作正常。有没有不使用JSNI的方法可以做到这一点?似乎这个问题很愚蠢,是的FlowPanel
可以很容易地包装或替换为FocusPanel
,它提供了许多监视/处理事件的方法。这里需要做的是将FlowPanel包装在FocusPanel中。FocusPanel包含所有可能的处理程序,因此可以为其设置ClickHandler
另一种方法是创建自己的小部件,扩展flowpanel并实现必要的接口,以便能够包含ClickHandler
我个人会推荐第一种方法。它更简单,编码速度更快,并且不会降低应用程序的速度。实际上,您可以这样做:
FlowPanel fPanel = new FlowPanel() {
@Override
public void onAttach() {
super.onAttach();
super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance
// of your ClickHandler
}
}
干杯 这对我很有效(显然,用你的CLICKHANDLER的名字代替“你的CLICKHANDLER”):
我找到的最好的解决办法是 我们的想法是扩展FlowPanel(或者实际上是SimplePanel)来实现相关的处理程序接口,对于不需要FocusPanel的全部功能和焦点功能的情况,这是一个更整洁的选项。见下文:
public class MouseAwareFlowPanel extends FlowPanel implements
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers
{
public HandlerRegistration addMouseOverHandler(MouseOverHandler handler)
{
return addDomHandler(handler, MouseOverEvent.getType());
}
public HandlerRegistration addMouseOutHandler(MouseOutHandler handler)
{
return addDomHandler(handler, MouseOutEvent.getType());
}
public HandlerRegistration addClickHandler(ClickHandler handler)
{
return addDomHandler(handler, ClickEvent.getType());
}
}
只需用FocusPanel包装FlowPanel,它也会为其他用户交互留下准备: 来源:
FlowPanel flowPanel = new FlowPanel();
FocusPanel focusPanel = new FocusPanel(flowPanel);
focusPanel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Hi!");
}
});
好吧,如果我正确理解FlowPanel和FocusPanel,你不能用FocusPanel替换FlowPanel,但你可以肯定地将FlowPanel包装在FocusPanel中。是的,
FocusPanel
是SimplePanel
实现,因此它不能包含多个子小部件。但是如果你的FlowPanel
只包含一个,你可以简单地用FocusPanel
:)替换它。好吧,只为一个孩子使用一个FlowPanel是没有用的。是的,这是一个有点黑客的方式,但是如果用户受到FlowPanel使用的限制,这个技巧对他来说是可行的。谢谢,如果我能给这个答案多次投票,我会的。对于那些不想接受所有类型活动的人来说,这也是一个很好的解决方案!谢谢
FlowPanel flowPanel = new FlowPanel();
FocusPanel focusPanel = new FocusPanel(flowPanel);
focusPanel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Hi!");
}
});