2

入力された文字と検出を処理するためにスマートなものが必要な次のコードがあります。

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 回トリガーされるのはなぜですか?

4

2 に答える 2

1

イベントを処理する代わりに、独自のものを作成し(内部キャッシュとして使用されるSuggestOracleラッピングが可能)、そこでクエリの長​​さと「パターン」をチェックして、サーバーを呼び出すかどうかを決定する必要があります (そして、提案の空のリストを提供します)。応答として、またはおそらく正確なクエリである単一の提案)。MultiSuggestOracle

補足として、正規表現を使用したくない理由がわかりません。java.lang.String正規表現を として取るメソッドを使用するStringか、com.google.gwt.regexp.shared.RegExpクラスを使用します。

于 2011-06-07T10:10:52.947 に答える
1

1. Up/Downハンドラの代わりにKeyPressHandlerを使用します。

私が理解している限りでは、キーボードで実際に押されたキーではなく、ユーザーが入力したものを取得することに関心があります。また、 KeyPressEvent.getCharCode()は char ( c ) を返すため、 Character.isDigit (c)およびCharacter.isLetter( c)を使用できます。

2.ある時点 (たとえば、ユーザーがEnterを押したとき) でテキストの長さを確認したい場合、

// 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;
            }
        }
    });
于 2011-06-06T17:37:10.060 に答える