是否可以通过键监听器检查SWT文本中的粘贴文本是否具有特殊字符?

时间:2014-12-09 11:10:40

标签: java swt jface

我有一个SWT文本,它只能接受属于这个范围的字符:[a-z] [A-Z] [0-9]。 为此,我在Text上添加了一个KeyListener,下面是代码。

Pattern pattern = Pattern.compile("[a-zA-Z0-9]+");

@Override
public void keyPressed(KeyEvent event) 
{
    String enteredCharacterInStr = String.valueOf(event.character);
    boolean isAlphaNumeric = pattern.matcher(enteredCharacterInStr).find();

    if(event.keyCode == SWT.ARROW_LEFT ||
        event.keyCode == SWT.ARROW_RIGHT ||
        event.keyCode == SWT.BS || 
        event.keyCode == SWT.DEL )
    {
        event.doit = true;
    }
    else if(isAlphaNumeric)
    {
        event.doit = true;
    }
    else if(event.stateMask == SWT.CTRL && (event.keyCode == 'a' ||
                                            event.keyCode == 'c' ||
                                            event.keyCode == 'v' ||
                                            event.keyCode == 'x' ) )
    {
        event.doit = true;
    }
    else
    {
        event.doit = false;
    }

}

上述代码适用于未输入特殊字符的用户,但是当用户在文本中复制包含特殊字符和粘贴的文本时,该代码将失败。

是否可以通过KeyListener实现此目的?

1 个答案:

答案 0 :(得分:3)

您可以使用VerifyListener,此示例仅允许1-8的数字:

    text.addVerifyListener(new VerifyListener() {
        @Override
        public void verifyText(VerifyEvent event) {
            char[] charArray = event.text.toCharArray();
            for (char testChar : charArray) {
                if (testChar <= '0' || testChar >= '9') {
                    event.doit = false;
                    return;
                }
            }
        }
    });

此示例过滤掉所有特殊字符:

    text.addVerifyListener(new VerifyListener() {
        @Override
        public void verifyText(VerifyEvent event) {
            event.text = event.text.replaceAll("[^A-Za-z0-9]", "");
        }
    });