Пусковое событие клика из кода в gwt - PullRequest
22 голосов
/ 06 августа 2009

Я создал собственный виджет в gwt, который расширяет составной. В этом я использую панель фокуса. Для FocusPanel я добавил ClickHandler. Затем я добавил список клавиш клавиатуры. Теперь при нажатии клавиши Enter он должен вызывать событие нажатия. Может Кто-нибудь поможет мне вызвать событие клика с помощью кода в GWT?

focusPanel.addKeyPressHandler(new KeyPressHandler() {
            public void onKeyPress(KeyPressEvent event) {
                if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)        {
                    // TODO call onClick() method
                }
            }
        });

Спасибо

Ответы [ 8 ]

20 голосов
/ 13 сентября 2011

Я сделал этот код:

if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)        {
    myButton.fireEvent( new GwtEvent<ClickHandler>() {
        @Override
        public com.google.gwt.event.shared.GwtEvent.Type<ClickHandler> getAssociatedType() {
        return ClickEvent.getType();
        }
        @Override
        protected void dispatch(ClickHandler handler) {
            handler.onClick(null);
        }
   });
}

Конечно, myButton должен быть окончательным или публичным, потому что вы находитесь внутри другого обработчика событий.

19 голосов
/ 06 августа 2009

Я не сделал этого для события щелчка, но я сделал изменения, подобные этому.

NativeEvent event = Document.get().createChangeEvent();
DomEvent.fireNativeEvent(event, this);

[createClickEvent] (http://google -web-toolkit.googlecode.com / svn / javadoc / 1.6 / com / google / gwt / dom / client / Document.html # createClickEvent (int,% Метод 20int,% 20int,% 20int,% 20int,% 20boolean,% 20boolean,% 20boolean,% 20boolean)) метод требует гораздо больше параметров.

public final NativeEvent createClickEvent(int detail,
                                          int screenX,
                                          int screenY,
                                          int clientX,
                                          int clientY,
                                          boolean ctrlKey,
                                          boolean altKey,
                                          boolean shiftKey,
                                          boolean metaKey)
15 голосов
/ 30 июля 2012

Вы также можете использовать простой метод JSNI, чтобы сделать это. Просто передайте свой элемент [например, button.getElement ()] к этому методу:

public static native void clickElement(Element elem) /*-{
    elem.click();
}-*/;
3 голосов
/ 13 июня 2013

Если целью является кнопка, вы можете просто вызвать ее метод click(). В противном случае вы можете сделать что-то вроде этого:

private void click(HasHandlers handlerSource) {
  NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
  DomEvent.fireNativeEvent(event, handlerSource);
}
2 голосов
/ 13 января 2011

Обратите внимание, что KeyPressHandler не работает в Firefox для специальных клавиш, таких как ENTER, вам необходимо использовать KeyUp или KeyDown

http://code.google.com/p/google-web-toolkit/issues/detail?id=5558#c6

2 голосов
/ 10 августа 2009

Метод, описанный DLH, должен работать, и кроме аргумента детализации (для которого я понятия не имею) у вас есть другие аргументы, доступные в KeyPressEvent.

Другое возможное решение - вызвать собственный элемент click() для элемента. Я сделал это в виджете кнопки (который доступен как с открытым исходным кодом). См. click() метод в следующем классе: http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/java/org/cobogw/gwt/user/client/ui/Button.java),, который вызывает определенный класс Event2, который реализует определенные браузером версии метода click.

Чтобы использовать этот метод, вы можете просто добавить файл jar с cobogw в ваш проект, включить Event.gwt.xml и вызвать Event2.fireClickEvent(getElement()); в вашем методе или использовать только код из классов Event2 и событие в вашем собственном проекте

Это решение также позволяет программно запускать событие щелчка.

Также взгляните на реализацию onBrowserEvent в классе Button, упомянутом выше, поскольку он обрабатывает событие ключа аналогичным образом, как вам нужно, и решает проблему запуска нескольких событий ключа, когда вам нужно только создать событие 1 клик.

1 голос
/ 06 августа 2009

Возможно ClickListenerCollection.fireClick () делает то, что вы хотите. Я не использовал его, хотя

Извините, это устарело и, возможно, даже не полезно. Полагаю, вместо этого вы посмотрите на widget.delegateEvent.

0 голосов
/ 16 февраля 2015

Вы можете просто сделать это:

focusPanel.fireEvent(new ClickEvent(){});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...