纯 GWT,事件转换
Pure GWT, events converting
所以,我在 GWT 中有一个“FlexTable”,我需要在某些单元格上右键单击下拉操作列表。在鼠标左键单击以检索我的单元格的“rowIndex”时,我只需使用 ClickEvent 方法“getCellForEvent(event).getRowIndex()”。但是纯 GWT 中没有右键单击处理程序。所以我决定使用需要 ContextMenuEvent 的 ContextMenuHandler。当然,我不能将 ContextMenuEvent 放入 ClickEvent 方法“getCellForEvent”中。这种情况有什么解决办法吗?或者也许有人知道在右键单击“FlexTable”时下拉列表的更简单方法。
我已经为 CellTable 或 DataGrid 小部件完成了此操作,但没有为 FlexTable 完成。对于前者,我将一个处理程序对象应用于整个网格小部件,并使用事件来计算事件发生的行或单元格。我看不出如何使用 FlexTable.
使用 FlexTable 的技巧是为每个单元格创建一个处理程序对象,并在创建时告诉它 cell/row。像这样:
cell.addDomHandler(new ContextMenuHandler() {
@Override
public void onContextMenu(ContextMenuEvent event)
{
// stop the browser from opening the context menu
event.preventDefault();
event.stopPropagation();
NativeEvent nativeClickEvent = event.getNativeEvent();
displayPopupMenuForCell(cell, nativeClickEvent);
}
}, ContextMenuEvent.getType());
在上面,cell
需要是一个Widget。所以你需要在 HTMLTable 中获取元素(FlexTable 扩展 HTMLTable 这是一个正常的 HTML table 元素)并将其包装为一个小部件。我不确定该怎么做,但这是可能的。
还有一件事,你需要阻止浏览器弹出它自己的上下文菜单。我将其添加到 body
标签中的 html 文件中:
<body oncontextmenu="return false" >
实际上,您可以使用点击处理程序来检查点击了哪个按钮,左按钮、右按钮或中间按钮,您需要做的是这样的:
Button button= new Button();
button.addClickHandler(event -> {
NativeEvent nativeEvent = event.getNativeEvent();
if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
event.stopPropagation();
//do something
}
});
如果您使用 CellTable 或 DataGrid 小部件,您可以处理单击单元格时触发的 CellPreviewEvent
,它还可以告诉您事件发生在哪个 row/cell 中。这里是一些代码:
private void makeItemRightClickListener()
{
grid.addCellPreviewHandler(new CellPreviewEvent.Handler<T>() {
@Override
public void onCellPreview(CellPreviewEvent<T> event)
{
if (event.getNativeEvent().getButton() !=
NativeEvent.BUTTON_RIGHT)
return;
// Prevent browser's own context menu from appearing
event.getNativeEvent().preventDefault();
event.getNativeEvent().stopPropagation();
handleItemRightClickEvent(event);
}
});
}
private void handleItemRightClickEvent(CellPreviewEvent<T> event)
{
NativeEvent nativeClickEvent = event.getNativeEvent();
// Get the data (type T) that is being displayed in the cell
// by the CellTable or DataGrid widget.
T rowClicked = event.getValue();
// Create PopupPanel for menu
PopupPanel popup = ...
// Show the popup menu at the click position
UIObject target = new MousePointUIObject(nativelickEvent);
popup.showRelativeTo(target);
}
private static class MousePointUIObject extends UIObject
{
private NativeEvent mouseEvent;
public MousePointUIObject(NativeEvent mouseEvent)
{
this.mouseEvent = mouseEvent;
}
@Override
public int getAbsoluteLeft()
{
return mouseEvent.getClientX() + Window.getScrollLeft();
}
@Override
public int getAbsoluteTop()
{
return mouseEvent.getClientY() + Window.getScrollTop();
}
@Override
public int getOffsetWidth()
{
return 0;
}
@Override
public int getOffsetHeight()
{
return 0;
}
}
所以,我在 GWT 中有一个“FlexTable”,我需要在某些单元格上右键单击下拉操作列表。在鼠标左键单击以检索我的单元格的“rowIndex”时,我只需使用 ClickEvent 方法“getCellForEvent(event).getRowIndex()”。但是纯 GWT 中没有右键单击处理程序。所以我决定使用需要 ContextMenuEvent 的 ContextMenuHandler。当然,我不能将 ContextMenuEvent 放入 ClickEvent 方法“getCellForEvent”中。这种情况有什么解决办法吗?或者也许有人知道在右键单击“FlexTable”时下拉列表的更简单方法。
我已经为 CellTable 或 DataGrid 小部件完成了此操作,但没有为 FlexTable 完成。对于前者,我将一个处理程序对象应用于整个网格小部件,并使用事件来计算事件发生的行或单元格。我看不出如何使用 FlexTable.
使用 FlexTable 的技巧是为每个单元格创建一个处理程序对象,并在创建时告诉它 cell/row。像这样:
cell.addDomHandler(new ContextMenuHandler() {
@Override
public void onContextMenu(ContextMenuEvent event)
{
// stop the browser from opening the context menu
event.preventDefault();
event.stopPropagation();
NativeEvent nativeClickEvent = event.getNativeEvent();
displayPopupMenuForCell(cell, nativeClickEvent);
}
}, ContextMenuEvent.getType());
在上面,cell
需要是一个Widget。所以你需要在 HTMLTable 中获取元素(FlexTable 扩展 HTMLTable 这是一个正常的 HTML table 元素)并将其包装为一个小部件。我不确定该怎么做,但这是可能的。
还有一件事,你需要阻止浏览器弹出它自己的上下文菜单。我将其添加到 body
标签中的 html 文件中:
<body oncontextmenu="return false" >
实际上,您可以使用点击处理程序来检查点击了哪个按钮,左按钮、右按钮或中间按钮,您需要做的是这样的:
Button button= new Button();
button.addClickHandler(event -> {
NativeEvent nativeEvent = event.getNativeEvent();
if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
event.stopPropagation();
//do something
}
});
如果您使用 CellTable 或 DataGrid 小部件,您可以处理单击单元格时触发的 CellPreviewEvent
,它还可以告诉您事件发生在哪个 row/cell 中。这里是一些代码:
private void makeItemRightClickListener()
{
grid.addCellPreviewHandler(new CellPreviewEvent.Handler<T>() {
@Override
public void onCellPreview(CellPreviewEvent<T> event)
{
if (event.getNativeEvent().getButton() !=
NativeEvent.BUTTON_RIGHT)
return;
// Prevent browser's own context menu from appearing
event.getNativeEvent().preventDefault();
event.getNativeEvent().stopPropagation();
handleItemRightClickEvent(event);
}
});
}
private void handleItemRightClickEvent(CellPreviewEvent<T> event)
{
NativeEvent nativeClickEvent = event.getNativeEvent();
// Get the data (type T) that is being displayed in the cell
// by the CellTable or DataGrid widget.
T rowClicked = event.getValue();
// Create PopupPanel for menu
PopupPanel popup = ...
// Show the popup menu at the click position
UIObject target = new MousePointUIObject(nativelickEvent);
popup.showRelativeTo(target);
}
private static class MousePointUIObject extends UIObject
{
private NativeEvent mouseEvent;
public MousePointUIObject(NativeEvent mouseEvent)
{
this.mouseEvent = mouseEvent;
}
@Override
public int getAbsoluteLeft()
{
return mouseEvent.getClientX() + Window.getScrollLeft();
}
@Override
public int getAbsoluteTop()
{
return mouseEvent.getClientY() + Window.getScrollTop();
}
@Override
public int getOffsetWidth()
{
return 0;
}
@Override
public int getOffsetHeight()
{
return 0;
}
}