所以,我在GWT中有一个'Flyxtable',我需要在右键单击某些单元格时删除操作列表。在左鼠标上,单击以检索我的单元格的" rowindex",我只需使用clickevent方法" getCellforevent(event(.getRowIndex(("。但是纯GWT中没有右键单击处理程序。因此,我决定使用ContextMenuHandler需要上下文设备。而且,当然,我不能将ContextMenueVent放入Clickevent方法" getCellforevent"中。有任何解决方案吗?或者,也许有人知道在" Flextable"上右键单上列出列表的更容易的方法。
我已经为celltable或datagrid小部件做了此操作,但不能弹出。使用前者,我将一个处理程序对象应用于整个网格小部件,并使用该事件来制定事件发生的行或单元。
使用Flextable,一个黑客将为每个单元格创建一个处理程序对象,并在创建时告诉单元/行。这样的东西:
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
需要是一个小部件。因此,您需要在HTMLTable中获取该元素(可弹出的HTMLTable,这是正常的HTML表元素(,并将其作为小部件包装。我不确定该怎么做,但可能会。
另一件事,您需要防止浏览器弹出自己的上下文菜单。我将其添加到body
标签中的HTML文件:
<body oncontextmenu="return false" >
实际上您可以使用Click Handler检查单击的按钮,左,右或中间您需要做的是这样的事情:
Button button= new Button();
button.addClickHandler(event -> {
NativeEvent nativeEvent = event.getNativeEvent();
if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
event.stopPropagation();
//do something
}
});
如果您使用celltable或datagrid小部件,则可以处理单击单元格时发射的 CellPreviewEvent
,并且还可以告诉您事件发生在此处。是一些代码:
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;
}
}