【问题标题】:GWT UiBinder: Add Mouse Handler to Panel or GridGWT UiBinder:将鼠标处理程序添加到面板或网格
【发布时间】:2010-10-10 21:07:22
【问题描述】:
我找不到将鼠标处理程序添加到 GWT 面板或网格的方法
在使用 UiBinder 时。
我基本上需要一种可以通过网格检测以下内容的方法:
- 检测事件发生在哪个单元格中。
- 检测鼠标向上事件
- 检测鼠标按下事件
- 检测鼠标移出事件
- 检测鼠标悬停事件
我曾计划尝试使用覆盖的绝对面板来执行此操作
网格的顶部。我可以在 AbsolutePanel 上检测到这些事件,
然后根据事件的位置,确定哪个单元格
如果没有 AbsolutePanel,事件会发生
覆盖在网格之上,然后采取相应的行动。我现在发现
在这些方面对面板施加完全相同的限制
点击处理程序,并且没有很多选项。
我只需要找到一种方法来让上述事件在网格上工作。
你会推荐什么?不使用 UiBinder,我使用的是 DomHandlers,
这似乎在 UiBinder 中被禁用(我错了吗?)。
非常感谢任何帮助。谢谢!
~斯科特
【问题讨论】:
标签:
gwt
grid
mouseevent
uibinder
【解决方案1】:
您可以扩展 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) {
...
}
希望对您有所帮助。
【解决方案2】:
...或者简单地将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");
}
});
}
}