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 是最佳选择吗?为什么按下任何键都会触发两次?

4

2 回答 2

1

1.我会使用KeyPressHandler而不是Up/Down处理程序。

据我了解,您更感兴趣的是获取用户键入的内容,而不是实际在键盘上按下的键。此外,您可以使用Character.isDigit(c)Character.isLetter(c),因为KeyPressEvent.getCharCode()将返回 char ( 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 回答
1

而不是处理事件,您应该自己制作SuggestOracle(可能包装 aMultiSuggestOracle用作内部缓存)并检查query的长度和“模式”以决定是否调用服务器(然后给出一个空的建议列表作为响应,或者可能是一个单一的建议是确切的查询)。

作为旁注,我不明白您为什么不想使用正则表达式;要么使用将java.lang.String正则表达式作为 a 的方法,String要么使用com.google.gwt.regexp.shared.RegExp类。

于 2011-06-07T10:10:52.947 回答