Подтвердить что ты не робот

Событие с нажатием стрелки из кода в gwt

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

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

Спасибо

4b9b3361

Ответ 1

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

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)

Ответ 2

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

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 должен быть окончательным или общедоступным, потому что вы находитесь внутри другого обработчика событий.

Ответ 3

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

public static native void clickElement(Element elem) /*-{
    elem.click();
}-*/;

Ответ 4

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

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

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

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

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

Ответ 6

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

private void click(HasHandlers handlerSource) {
  NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
  DomEvent.fireNativeEvent(event, handlerSource);
}

Ответ 7

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

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

Ответ 8

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

focusPanel.fireEvent(new ClickEvent(){});