Проверьте, являются ли два первых введенных символа буквенно-цифровыми - без регулярных выражений - PullRequest
2 голосов
/ 06 июня 2011

У меня есть следующий код, которому нужно что-то умное, чтобы иметь дело с набранными символами и обнаружением:

private final MultiWordSuggestOracle mySuggestions = new MultiWordSuggestOracle();
private final Set<String> mySuggestionsData = new HashSet<String>();

@UiHandler("suggestBox")
public void onKeyPress(KeyDownEvent event) {
    if (Character.isLetterOrDigit(event.getCharCode())) {
        char[] text = suggestBox.getText().trim().toCharArray();
        if (text.length != 1) return;

        for (char ch : text) {
            if (!Character.isLetterOrDigit(ch)) {
                return;
            }
        }
        //load data from server into mySuggestionsData
    }     
}

Вопрос состоит из 3 частей:

  1. Как проверить нажатие клавиши на буквенно-цифровые символы? Имейте в виду, что это GWT, поэтому я бы предпочел не использовать регулярные выражения (но если нет другого варианта ...).

  2. Как лучше всего определить длину текста, набираемого в SuggestBox?

  3. Является ли KeyDownEven лучшим выбором? И почему он срабатывает дважды при нажатии любой клавиши?

Ответы [ 2 ]

1 голос
/ 07 июня 2011

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

В качестве примечания, я не понимаю, почему вы не хотите использовать регулярные выражения; либо с использованием методов java.lang.String, принимающих регулярное выражение в качестве String, либо класса com.google.gwt.regexp.shared.RegExp.

1 голос
/ 06 июня 2011

1. Я бы использовал KeyPressHandler вместо Up / Down обработчик.

Насколько я понимаю, вам больше интересно узнать, что набрал пользователь, а не ту клавишу, которая была фактически нажата на клавиатуре. Кроме того, вы можете использовать Character.isDigit (c) и Character.isLetter (c) , поскольку KeyPressEvent.getCharCode () вернет символ ( c ).

2. Скорее всего, вы хотите проверить длину текста в какой-то момент (например, когда пользователь нажимает Введите ), затем

// handler block
if (c == KeyCodes.KEY_ENTER) {
    int length = ((SuggestBox) event.getSource()).getText().length();
    // take an action depending on length
}
// handler block continued

должно соответствовать.

3. См. [1] и, возможно, это зависит от браузера.

Редактировать: [1], [2] и [3] вместе (используя KeyUpHandler ):

private static final int THREASHOLD = 2;
private String phrase = "";
...
    searchBox.addKeyUpHandler(new KeyUpHandler() {
        @Override
        public void onKeyUp(KeyUpEvent event) {
            String text = ((SuggestBox) event.getSource()).getText();
            if (!phrase.equals(text)) {
                if (text.length() >= THREASHOLD) {
                    boolean alphanum = true;
                    for (int i = 0; i < THREASHOLD; i++) {
                        char c = text.charAt(i);
                        if (!Character.isDigit(c) && !Character.isLetter(c)) {
                            alphanum = false;
                            break;
                        }
                    }
                    if (alphanum) {
                        //RPC (won't be called twice)
                    }
                }
                phrase = text;
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...