有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java纯GWT,事件转换

所以,我在GWT中有一个“FlexTable”,我需要在右键单击某个单元格时下拉操作列表。在鼠标左键单击以检索单元格的“rowIndex”时,我只需使用ClickEvent方法“getCellForEvent(event)”。getRowIndex()。但在纯GWT中没有右键单击处理程序。所以我决定使用ContextMenuHandler,它需要ContextMenuEvent。当然,我不能将ContextMenuEvent放入ClickEvent方法“getCellForEvent”中。这个案子有什么解决办法吗?或者也许有人知道右键点击“FlexTable”下拉列表的更简单方法


共 (3) 个答案

  1. # 1 楼答案

    如果使用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;
        }
    }
    
  2. # 2 楼答案

    实际上,您可以使用click handler检查单击了什么按钮,左边、右边或中间,您需要做的事情如下:

    Button button= new Button();
    button.addClickHandler(event -> {
        NativeEvent nativeEvent = event.getNativeEvent();
        if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
            event.stopPropagation();
            //do something
        }
    });
    
  3. # 3 楼答案

    我已经为CellTable或DataGrid小部件完成了这项工作,但没有为FlexTable。对于前者,我将一个handler对象应用于整个网格小部件,并使用事件计算出事件发生的行或单元格。我看不出FlexTable如何做到这一点

    使用FlexTable,一个技巧是为每个单元格创建一个handler对象,并在创建时告诉它单元格/行。大概是这样的:

        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中获取元素(FlexTable exends HTMLTable是一个普通的HTML表格元素),并将其包装为一个小部件。我不知道怎么做,但这是可能的

    还有一件事,您需要防止浏览器弹出自己的上下文菜单。我将其添加到body标记中的html文件中:

      <body oncontextmenu="return false" >