GWT: обработка нескольких событий на метке

Я хочу обрабатывать события на метке, когда пользователь удерживает нажатой какую-либо клавишу (Ctrl), а затем одновременно нажимает кнопку мыши (Ctrl + щелчок мыши), например, открывает какое-то окно и т. д. Как я могу сделать это в GWT? Должен ли я добавить два обработчика или можно сделать это с одним?

Спасибо.

al


person Deam    schedule 03.02.2011    source источник


Ответы (2)


В обработчике кликов вы можете проверить, нажата ли клавиша Ctrl при запуске события, см. пример ниже. Вы также можете проверить конкретную кнопку мыши, на которую нажал пользователь. Я также добавил это в пример:

yourLabel.addClickHandler(new ClickHandler() {
    if(NativeEvent.BUTTON_LEFT == event.getNativeButton() &&
        event.isControlKeyDown()) {
        //do what you want
    }
});

Или для более старой версии GWT вместо event.isControlKeyDown используйте event.getNativeEvent().getCtrlKey(), которая возвращает логическое значение true, если управляющая клавиша нажата при запуске этого события.

person Hilbrand Bouwkamp    schedule 22.02.2011

Редактировать: этот код содержит ошибки, посмотрите ответ Хильбранда

Честно говоря, я не думаю, что вы можете сделать это с 1 или 2 обработчиками. Я думаю, вам понадобится 3 обработчика.

  1. KeyDownHandler, который устанавливает логическое значение, которое вы можете позже прочитать из MouseDownHandler
  2. MouseDownHandler, который делает то, что вы хотите
  3. KeyUpHandler, который сбрасывает значение логического значения в KeyDownHandler.

    boolean ctrlPressed;
    yourLabel.addDomHandler(new KeyDownHandler() {
        public void onKeyDown(KeyDownEvent event) {
            if(event.getAssociatedType().equals(KeyCodes.KEY_CTRL))
                ctrlPressed=true;                   
        }
    }, KeyDownEvent.getType()); 
    
    yourLabel.addDomHandler(new KeyUpHandler() {
        public void onKeyUp(KeyUpEvent event) {
            if(event.getAssociatedType().equals(KeyCodes.KEY_CTRL))
                ctrlPressed=false;                  
            }
    }, KeyUpEvent.getType()); 
    
    yourLabel.addClickHandler(new ClickHandler() {
        if(ctrlPressed) {
            //do what you want
        }
    });
    
person Chris Boesing    schedule 03.02.2011
comment
Я думаю, это ошибка во 2-й строке? yourLabel.addKeyDownHandler (новый KeyDownHandler () { - person Deam; 03.02.2011
comment
Да, было, извините. Просто удалите эту строку. Я отредактировал ответ. - person Chris Boesing; 03.02.2011
comment
Кстати, возможно ли переопределить onBrowserEvent? например, получить ключ Crtl и установить логическое значение, а затем щелкнуть, я делаю все, что хочу? - person Deam; 03.02.2011
comment
Я не использовал onBrowserEvent, поэтому не могу ответить на этот вопрос. - person Chris Boesing; 03.02.2011
comment
Я проголосовал за этот ответ, потому что код в этом ответе глючит! Проблема заключается в том, что когда пользователь нажимает клавишу Ctrl, виджет теряет фокус, тогда событие keyup никогда не срабатывает, а виджет остается в состоянии, в котором нажата клавиша Ctrl. В следующий раз, когда пользователь щелкнет этот виджет без нажатия клавиши Ctrl, он будет работать неправильно, как если бы была нажата клавиша Ctrl, потому что он все еще находится в этом состоянии. - person Hilbrand Bouwkamp; 22.02.2011
comment
@ Хильдебранд большое спасибо за ответ. Я отлажу его, когда найду время, но я не думаю, что вы правы в том, что виджет теряет фокус, если вы нажимаете Ctrl. Если бы это произошло, вы не смогли бы скопировать текст в текстовое поле с помощью Ctrl + V. - person Chris Boesing; 22.02.2011
comment
@Крис. Я записал это быстро :-). Ваше право виджет не теряет фокус. Я хотел сказать, что в случае использования, когда что-то заставит виджет потерять фокус. Это может быть что-то просто, когда пользователь щелкает какую-то другую область в браузере или за его пределами, или просто потому, что ОС выдает всплывающее окно. - person Hilbrand Bouwkamp; 22.02.2011