Чистый GWT, преобразование событий - PullRequest
0 голосов
/ 27 мая 2019

Итак, у меня есть «FlexTable» в GWT, и мне нужно раскрыть список действий при щелчке правой кнопкой мыши по какой-либо ячейке.При нажатии левой кнопки мыши, чтобы получить 'rowIndex' из моей ячейки, я просто использую метод ClickEvent 'getCellForEvent (event) .getRowIndex ()'.Но в чистом GWT нет обработчика правых кликов.Поэтому я решил использовать ContextMenuHandler, который требует ContextMenuEvent.И, конечно, я не могу поместить ContextMenuEvent в метод ClickEvent 'getCellForEvent'.Есть ли решение для этого случая?Или, может быть, кто-то знает более простой способ выпадающего списка в правом клике на «FlexTable».

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

На самом деле вы можете использовать обработчик кликов, чтобы проверить, какая кнопка была нажата: слева, справа или в середине, что вам нужно сделать, это примерно так:

Button button= new Button();
button.addClickHandler(event -> {
    NativeEvent nativeEvent = event.getNativeEvent();
    if(NativeEvent.BUTTON_RIGHT == nativeEvent.getButton()){
        event.stopPropagation();
        //do something
    }
});
2 голосов
/ 28 мая 2019

Я сделал это для виджета 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 должен быть виджетом.Поэтому вам нужно получить элемент в HTMLTable (FlexTable расширяет HTMLTable, который является обычным элементом таблицы HTML) и обернуть его как виджет.Я не уверен, как это сделать, но это было бы возможно.

Еще одна вещь, вам нужно предотвратить появление в браузере собственного контекстного меню.Я добавил это в html-файл в теге body:

  <body oncontextmenu="return false" >
1 голос
/ 30 мая 2019

Если вы используете виджет 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;
    }
}
...