keyPressEvent.getCharCode() возвращает 0 для всех специальных клавиш, таких как ввод, вкладка, выход и т. д.

Мой код:

@Override
public void onKeyPress(KeyPressEvent event)
{
    if (event.getCharCode() == KeyCodes.KEY_ENTER)
    {
        registerButton.click();
    }
}

Это прикреплено к TextBox и срабатывает, когда я нажимаю ввод. event.getCharCode() это просто ноль, а не 13. Когда я нажимаю Tab, это 0, а когда я нажимаю escape, это 0. Арх!

Вчера это работало правильно, и что-то изменилось где-то еще в проекте, чтобы повлиять на это, но я не уверен, что это может быть. Похоже, что за последний день не было внесено никаких существенных изменений.

Если вместо этого я обрабатываю KeyUpEvent, это работает, как и ожидалось.

Я использую GWT 2.1.0. Спасибо за любые идеи!


person Riley Lark    schedule 06.11.2010    source источник
comment
Эта часть кажется правильной, не могли бы вы добавить остальную часть кода?   -  person Michaël    schedule 08.11.2010
comment
Чтобы изолировать проблему, я создал пример приложения с плагином Eclipse и добавил KeyPressHandler в создаваемое им TextBox... та же проблема! Я сообщил об ошибке на странице code.google.com/p/google-web-toolkit/issues/   -  person Riley Lark    schedule 08.11.2010


Ответы (6)


KeyPressHandler используется, например, для клавиш SHIFT, CTRL, ALT.

Если вы хотите привязать событие к другому ключу, вы должны использовать KeyDownHandler.

nameField.addKeyDownHandler(new KeyDownHandler() {

    @Override
    public void onKeyDown(KeyDownEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            Window.alert("hello");
        }

    }

});
person Michaël    schedule 09.11.2010
comment
Это сработало для меня, спасибо. Я использовал KeyPressEvent, и он правильно обнаружил нажатие клавиши ввода в IE и Chrome, но не в Firefox (он возвращал 0). Но это решение сработало для меня. - person Michael; 05.10.2011
comment
Да, KeyPressEvent (а не getNativeKeyCode) работает у меня в Internet Explorer и Chrome, но не в Firefox [42]. KeyDownHandler и getnativeKeyCode не нужны, чтобы зайти так далеко. - person cellepo; 09.11.2015
comment
Но ответ пользователя 2015482 работает в FF. Это должен быть принятый ответ! - person cellepo; 09.11.2015

или вы можете попробовать это

if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
}
person Daniel Cerecedo    schedule 11.11.2010
comment
Это не сработало для меня. Мне пришлось переключиться с KeyPressHandler на KeyDownHandler (IE и Chrome работали нормально, а Firefox — нет). - person Michael; 05.10.2011
comment
Несмотря на то, что он был выбран спрашивающим, это не самый полный и правильный ответ на вопрос. Вместо этого используйте ответ @Michaël для межбраузерной функциональности. - person Mark Tielemans; 25.01.2013

KeyUpHandler следует использовать вместо KeyPresshandler.

newSymbolTextBox.addKeyUpHandler(new KeyUpHandler() {
    @Override
    public void onKeyUp(KeyUpEvent event) {
        if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
            addStock();
        }
    }
});
person user2015482    schedule 27.01.2013
comment
Это работает и должно быть принятым ответом: он также работает в Firefox. См. также stackoverflow.com/a/5570608/1357094. - person cellepo; 09.11.2015

Они могут изменить поведение на FF. Я использую GWT 2.4.0 и Firefox 10. Согласно этому comment. Вы должны использовать что-то вроде ниже, прежде чем они исправят проблему:

@Override
public void onKeyPress(KeyPressEvent event) {
    int keyCode = event.getUnicodeCharCode();
    if (keyCode == 0) {
        // Probably Firefox
        keyCode = event.getNativeEvent().getKeyCode();
    }
    if (keyCode == KeyCodes.KEY_ENTER) {
        // Do something when Enter is pressed.
    }
}
person Vin    schedule 19.02.2012

У меня возникла такая же проблема при обновлении с 2.0.4 до 2.2.1, так что, похоже, это связано с кодом gwt.

Часть проблемы заключается в том, что KeyPressedEvent представляет собственное (т. е. зависящее от браузера) событие нажатия клавиши. В ошибка, о которой вы сообщили по этой проблеме, в одном из комментариев говорится:

Однако ожидается, что "escape" не генерирует KeyPressEvent (поведение IE и WebKit); вы должны использовать KeyDown или KeyUp для них. Firefox (и Opera), к сожалению, запускает гораздо больше событий нажатия клавиш, чем другие (IE и WebKit, которые имеют наиболее разумную реализацию, ту, которую W3C собирается стандартизировать в событиях DOM 3, AFAICT), но в этом случае getCharCode() равно 0 так что смело можете их игнорировать. Единственным исключением (могут быть и другие) является клавиша «ввод». События key/char в браузерах представляют собой такой беспорядок, что GWT мало что делает для гомогенизации вещей (по крайней мере, на данный момент).

Пока этот беспорядок не будет устранен, лучше всего использовать обходной путь с помощью KeyDownHandler или KeyUpHandler.

person bspoel    schedule 14.04.2011

УВТ 2.5:

public void onKeyPress(KeyPressEvent event) {
    if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
        // Event
    }
}
person Sentence    schedule 26.02.2013
comment
Спасибо, что написали. Это отличается от принятого ответа? - person Riley Lark; 26.02.2013