我有一个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实现此目的?
答案 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]", "");
}
});