我有以下代码需要智能处理字符和检测中的类型:
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
}
}
这个问题有三个部分:
如何针对字母数字字符测试按下的键。请记住这是GWT所以我宁愿不使用正则表达式(但如果没有其他选项......)。
检测输入SuggestBox的文本长度的最佳方法是什么?
KeyDownEven是最好的选择吗?为什么在按下任何键时它会被触发两次?
答案 0 :(得分:1)
1。我使用 KeyPressHandler 代替向上/向下处理程序。
据我了解,您更感兴趣的是获取用户输入的内容但不是键盘上实际按下的键。此外,您可以使用 Character.isDigit(c)和 Character.isLetter(c),因为 KeyPressEvent.getCharCode()将返回char(< EM> 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;
}
}
});
答案 1 :(得分:1)
您应该创建自己的SuggestOracle
(可能包裹MultiSuggestOracle
用作内部缓存)而不是处理事件,并检查查询的长度和“模式” “那里决定是否调用服务器(然后给出一个空的建议列表作为响应,或者单个建议是确切的查询)。
作为旁注,我不明白为什么你不想使用正则表达式;使用java.lang.String
方法将正则表达式作为String
或com.google.gwt.regexp.shared.RegExp
类。