Как реализовать щелчок правой кнопкой и левой кнопкой мыши с помощью ClickHandler на FlexTable (с помощью «новой» модели обработки событий GWT) - PullRequest
2 голосов
/ 30 сентября 2010

Проще говоря, у меня есть FlexTable (или что-то похожее, что наследуется от FlexTable) и я хочу добавить ClickHandler (или расширенный ClickHandler), но НЕТ ClickListener к FlexTable, и должна быть возможность обрабатывать«-» и «правый щелчок» - события.

Я знаю, что ядро ​​GWT не поддерживает щелчок правой кнопкой мыши / ContextMenus, поскольку GWT-dev-team считает, что веб-приложения должны иметь «обычное поведение»"при щелчке правой кнопкой мыши по умолчанию отображается контекстное меню браузера;Я полностью согласен, так или иначе, я должен реализовать это для клиента.Есть пример на http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/, но он использует GWT "старую модель обработки событий".Я ищу решение, не использующее устаревшие материалы (в GWT 2.0.4).

Заранее благодарим за любую полезную подсказку или "решение"!

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

Я нашел решение, которое работает.

теперь все-таки выглядит довольно просто. я много раз пробовал подобные вещи, но безуспешно; но теперь это работает. по-видимому, решение на самом деле не использует то, что я рассматривал как «новую модель событий» в начальной публикации ... ... однако без переопределения com.google.gwt.user.client.ui.Widget # onBrowserEvent (Event theEvent) пока не вижу решения.

public class RceFlexTable extends FlexTable {

    public RceFlexTable() {
        sinkEvents(Event.ONCONTEXTMENU);
    }

    List<List<ContextClickHandler> contextClicktClickHandlers= new ArrayList<ContextClickHandler>();

    public void addContextClickHandler(ContextClickHandler theContextClickHandler ){
        contextClicktClickHandlers.add(theContextClickHandler);
    }
    void removeContextClickHandler(ContextClickHandler theContextClickHandler ){
        contextClicktClickHandlers.remove(theContextClickHandler);
    }

    @Override
    public void onBrowserEvent(Event theEvent) {
        int anEventType = DOM.eventGetType(theEvent);
        if(anEventType == Event.ONCONTEXTMENU) {
            //Window.alert("context=Right Click detected");
            for(int i=0; i<contextClicktClickHandlers.size();i++){
                contextClicktClickHandlers.get(i).handleContextClick(theEvent);
            }
            // System.out.println("context=Right Click detected");
            theEvent.stopPropagation();// This will stop the event from being propagated
            theEvent.preventDefault();
        } else {
            // other browser events
            super.onBrowserEvent(theEvent);
        }
    }


}

public interface ContextClickHandler {
    /**
     * hanler for right clicks
     * @param theEvent
     */
    void handleContextClick(Event theEvent);
}
0 голосов
/ 01 октября 2010

Вам понадобится расширить FlexTable для обработки событий мыши;правая кнопка мыши не вызывает ClickEvent.Для краткости я просто реализую mouseDown:

public class FlexTableWithMouseEvents
        extends FlexTable implements HasMouseDownHandlers {

    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
        return addDomHandler(handler, MouseDownEvent.getType());
    }

    // This useful method is taken from HTMLTable. Only the signature needs
    // to be changed, unfortunately that means copying the whole method.
    public Cell getCellForEvent(MouseEvent event) {
        Element td = getEventTargetCell(Event.as(event.getNativeEvent()));
        if (td == null) {
            return null;
        }

        Element tr = DOM.getParent(td);
        Element body = DOM.getParent(tr);
        int row = DOM.getChildIndex(body, tr);
        int column = DOM.getChildIndex(tr, td);

        return new Cell(row, column);
    }
}

, а затем:

flexTable.addMouseDownHandler(new MouseDownHandler() {
    public void onClick(MouseDownEvent event) {
        Cell cell = flexTable.getCellForEvent(event);
        int button = event.getNativeEvent().getButton();
        if (button == NativeEvent.BUTTON_LEFT) {
            doLeftClick(cell);
        }

        if (button == NativeEvent.BUTTON_RIGHT) {
            event.preventDefault();
            doRightClick(cell);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...