Событие с нажатием стрелки из кода в 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
}
}
});
Спасибо
Ответы
Ответ 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 клик.
Ответ 5
Обратите внимание, что KeyPressHandler не работает в Firefox для специальных клавиш, таких как ENTER, вам нужно будет использовать KeyUp или KeyDown
http://code.google.com/p/google-web-toolkit/issues/detail?id=5558#c6
Ответ 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(){});