纯GWT,事件转换



所以,我在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;
    }
}

最新更新