3 回答
TA貢獻1803條經驗 獲得超6個贊
我已經為 CellTable 或 DataGrid 小部件完成了此操作,但沒有為 FlexTable 完成此操作。對于前者,我將一個處理程序對象應用于整個網格小部件,并使用該事件計算出事件發生的行或單元格。我看不出如何使用 FlexTable 完成此操作。
使用 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需要是一個Widget。因此,您需要獲取 HTMLTable 中的元素(FlexTable 擴展了 HTMLTable,這是一個普通的 HTML 表格元素)并將其包裝為一個 Widget。我不確定該怎么做,但這是可能的。
另一件事,您需要防止瀏覽器彈出自己的上下文菜單。我將其添加到body標簽中的 html 文件中:
<body oncontextmenu="return false" >
TA貢獻1780條經驗 獲得超4個贊
實際上你可以使用點擊處理程序來檢查點擊了哪個按鈕,左,右或中間你需要做的是這樣的:
Button button= new Button();
button.addClickHandler(event -> {
NativeEvent nativeEvent = event.getNativeEvent();
if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
event.stopPropagation();
//do something
}
});
TA貢獻2019條經驗 獲得超9個贊
如果您使用 CellTable 或 DataGrid Widget,您可以處理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;
}
}
添加回答
舉報
