2

在使用 UiBinder 时,我找不到将鼠标处理程序添加到 GWT 面板或网格的方法。

我基本上需要一种可以通过网格检测以下内容的方法:

  1. 检测事件发生在哪个单元格中。
  2. 检测鼠标向上事件
  3. 检测鼠标按下事件
  4. 检测鼠标退出事件
  5. 检测鼠标悬停事件

我曾计划尝试使用覆盖在网格顶部的绝对面板来执行此操作。我可以在 AbsolutePanel 上检测到这些事件,然后根据事件的位置,确定如果 AbsolutePanel 没有覆盖在 Grid 顶部,事件将发生在哪个单元格中,然后采取相应的行动。我现在发现在点击处理程序方面对面板施加了完全相同的限制,并且没有太多选项。

我只需要找到一种方法来让上述事件在网格上工作。你会推荐什么?不使用 UiBinder,我使用的是 DomHandlers,它似乎在 UiBinder 中被禁用(我错了吗?)。

非常感谢任何帮助。谢谢!

~斯科特

4

2 回答 2

3

您可以扩展 Grid 并让它实现适当的接口,例如:

public class ClickableGrid extends Grid implements HasMouseDownHandlers {
     ...
    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
        return addDomHandler(handler, MouseDownEvent.getType());
    }

}

然后在模板中使用它

<my:ClickableGrid ui:field="clickableGrid">

并在拥有类中添加处理程序

@UiHandler("clickableGrid")
    void handleClick(MouseDownEvent event) {
...
}

希望能帮助到你。

于 2010-10-12T08:35:54.837 回答
3

...或者简单地将Grid内部放置一个FocusPanel

public class MouseGrid extends Composite {

    public MouseGrid() {
        Grid grid = new Grid(3, 3);
        for (int row = 0; row < 3; ++row) {
            for (int col = 0; col < 3; ++col) {
                grid.setText(row, col, "" + row
                        + ", "
                        + col);
            }
        }
        FocusPanel panel = new FocusPanel();
        panel.setWidget(grid);
        initWidget(panel);
        panel.addMouseDownHandler(new MouseDownHandler() {

            @Override
            public void onMouseDown(MouseDownEvent event) {
                Window.alert("mouse down");
            }
        });
    }
}
于 2010-10-14T19:06:03.540 回答