为了账号安全,请及时绑定邮箱和手机立即绑定

纯 GWT,事件转换

纯 GWT,事件转换

千巷猫影 2022-12-15 16:32:36
因此,我在 GWT 中有一个“FlexTable”,我需要在右键单击某个单元格时下拉操作列表。在鼠标左键单击以检索我的单元格的“rowIndex”时,我只需使用 ClickEvent 方法“getCellForEvent(event).getRowIndex()”。但是纯 GWT 中没有右键单击处理程序。所以我决定使用需要 ContextMenuEvent 的 ContextMenuHandler。当然,我不能将 ContextMenuEvent 放入 ClickEvent 方法“getCellForEvent”中。这种情况有什么解决办法吗?或者也许有人知道在右键单击“FlexTable”时下拉列表的更简单方法。
查看完整描述

3 回答

?
慕码人8056858

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" >


查看完整回答
反对 回复 2022-12-15
?
Helenr

TA贡献1780条经验 获得超3个赞

实际上你可以使用点击处理程序来检查点击了哪个按钮,左,右或中间你需要做的是这样的:


Button button= new Button();

button.addClickHandler(event -> {

    NativeEvent nativeEvent = event.getNativeEvent();

    if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){

        event.stopPropagation();

        //do something

    }

});


查看完整回答
反对 回复 2022-12-15
?
慕少森

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;

    }

}


查看完整回答
反对 回复 2022-12-15
  • 3 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信