Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试输入的前两个字符是否为字母数字-无正则表达式_Java_Gwt_Detect_Alphanumeric_Chars - Fatal编程技术网

Java 测试输入的前两个字符是否为字母数字-无正则表达式

Java 测试输入的前两个字符是否为字母数字-无正则表达式,java,gwt,detect,alphanumeric,chars,Java,Gwt,Detect,Alphanumeric,Chars,我有以下代码需要一些智能的东西来处理输入字符和检测: private final MultiWordSuggestOracle mySuggestions = new MultiWordSuggestOracle(); private final Set<String> mySuggestionsData = new HashSet<String>(); @UiHandler("suggestBox") public void onKeyPress(KeyDownEve

我有以下代码需要一些智能的东西来处理输入字符和检测:

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
    }     
}
private final MultiWordSuggestOracle mySuggestions=new MultiWordSuggestOracle();
私有最终集mySuggestionsData=new HashSet();
@UiHandler(“建议框”)
public void onKeyPress(按键事件){
if(Character.isleterOrdigit(event.getCharCode())){
char[]text=suggestBox.getText().trim().toCharArray();
如果(text.length!=1)返回;
for(字符:文本){
if(!Character.isleterordigit(ch)){
返回;
}
}
//将数据从服务器加载到mySuggestionsData中
}     
}
问题共分三部分:

  • 如何根据字母数字字符测试按下的键。请记住这是GWT,所以我不想使用正则表达式(但如果没有其他选项…)

  • 检测SuggestBox中输入的文本长度的最佳方法是什么

  • Keydown是最好的选择吗?为什么按下任何键都会触发两次


  • 1。我会使用按键处理程序而不是上/下处理程序

    据我所知,您更感兴趣的是用户输入的内容,而不是键盘上实际按下的键。此外,您还可以使用Character.isDigit(c)和Character.isLetter(c),因为KeyPressEvent.getCharCode()将返回char(c)

    2.您可能希望在某个点(例如,当用户按Enter键时)检查文本长度,然后

    应该合适

    3.请参见[1],它可能是特定于浏览器的

    编辑:[1]、[2]和[3]组合(使用KeyUpHandler):

    private static final int THREASHOLD=2;
    私有字符串短语=”;
    ...
    addKeyUpHandler(新的KeyUpHandler(){
    @凌驾
    公共无效onKeyUp(KeyUpEvent事件){
    字符串文本=((SuggestBox)event.getSource()).getText();
    如果(!短语等于(文本)){
    if(text.length()>=THREASHOLD){
    布尔alphanum=true;
    for(int i=0;i
    您不应该处理事件,而应该创建自己的
    SuggestOracle
    (可能包装一个用作内部缓存的
    MultiSuggestOracle
    ),并在那里检查查询的长度和“模式”,以决定是否调用服务器(然后给出一个空的建议列表作为响应,或者一个建议作为确切的查询)


    顺便说一句,我不明白你为什么不想使用正则表达式;或者使用
    java.lang.String
    方法将正则表达式作为
    字符串,或者使用
    com.google.gwt.regexp.shared.regexp
    类。

    @Mat Banik:uff,我完全错过了标题。然后是的,除了附加KeyUp处理程序之外,我不知道其他方法;will在一分钟内更新答案。@Mat Banik:
    就特定于浏览器的GWT而言
    -我不太确定(特别是关于按键/keydown事件处理);希望更新对您有一定价值。@Mat Banik:这看起来像您的情况:(另外,众所周知,某些平台上的某些浏览器会两次触发keypup/Down事件)代码中的某个地方:
    static final RegExp至少两次ALPHANUMS=RegExp.compile(“^[a-zA-Z0-9]{2,}$”;
    然后当您需要检查它是否匹配时:
    如果(至少两次ALPHANUMS.test(request.getQuery())…
    // handler block
    if (c == KeyCodes.KEY_ENTER) {
        int length = ((SuggestBox) event.getSource()).getText().length();
        // take an action depending on length
    }
    // handler block continued
    
    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;
                }
            }
        });