public class VerifyText {
private Text text;//传入的组件,还可以是可书写下拉框等
private String regExp;//正则规则
public static final String REG_INT = "^([1-9]\\d*)|(0)|(-)|(-[1-9]\\d*)$"; // 整数
public static final String REG_NONNEGATIVEINT = "^([1-9]\\d*)|(0)$"; // 非负整数(正整数 + 0)
public static final String REG_POSITIVEINT = "^[1-9]\\d*$"; // 正整数
public static final String REG_NONPOSITIVEINT = "^(-)|(-[1-9]\\d*)|(0)$"; // 非正整数(负整数 + 0)
public static final String REG_NEGATIVEINT = "^(-)|(-[1-9]\\d*)$"; // 负整数
private int integerNum;//全局变量 正数位数
private int fractionNum;//全局变量 负数位数
/**
* 使用正则表达式进行用户输入验证
* @param text 传入的Text控件对象
* @param regExp 正则表达式字符串
*/
public VerifyText(Text text, String regExp) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener"); //$NON-NLS-1$
//如果有其他监听,清空,这个要看情况确定是否有,选加
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null); //$NON-NLS-1$
}
//主监听
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); //$NON-NLS-1
if (regExpVerifyListener != null) {
this.text.setData("DigitVerifyListener", null);
this.text.removeVerifyListener(regExpVerifyListener);
}
this.regExp = regExp;
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
* @param text 传入的Text控件对象
* @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1
* @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1
* @param isPositive 是否形成正数,true 正数和零,false负数和零
*/
public VerifyText(Text text, int integerNum, int fractionNum, boolean isPositive) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener");
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null);
}
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener");
if (regExpVerifyListener != null) {
this.text.removeVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", null);
}
this.integerNum = integerNum;
this.fractionNum = fractionNum;
this.regExp = populateRegExp(isPositive) + "|" + "(0)";
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
/**
* 给定整数和小数位数进行用户输入验证(正负数,零均可)
* @param text 传入的Text控件对象
* @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1
* @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1
*/
public VerifyText(Text text, int integerNum, int fractionNum) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener");
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null);
}
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); //$NON-NLS-1$
if (regExpVerifyListener != null) {
this.text.removeVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", null);
}
this.integerNum = integerNum;
this.fractionNum = fractionNum;
this.regExp = populateRegExp(true) + "|" + "(0)" + "|" + populateRegExp(false);
;
//新建监听,将新建的class的参数传入新建的监听
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
//确定正则规则
private String populateRegExp(boolean isPositive) {
StringBuffer buffer = new StringBuffer();
buffer.append("^");
buffer.append(!isPositive ? "(-)|" : "");
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d*" + ")");
buffer.append("|");
} else if (integerNum > 0) {
buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d{0," + (integerNum - 1) + "}" + ")");
buffer.append("|");
}
if (fractionNum == -1) {
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")");
}
buffer.append("|");
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d*" + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + "\\d*"
+ ")"); //$NON-NLS-1$
}
} else if (fractionNum > 0) {
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")");
}
buffer.append("|");
if (integerNum == -1) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d{0," + (fractionNum - 1)
+ "}" + ")"); //$NON-NLS-1$ //$NON-NLS-2$
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\."
+ "\\d{0," + fractionNum + "}" + ")");
}
}
buffer.append("$");
return buffer.toString();
}
//执行的监听
private class RegExpVerifyListener implements VerifyListener {
public void verifyText(VerifyEvent e) {
if (e.doit == true) {
e.doit = false;
if (fractionNum == -1 || fractionNum > 0) {
if (e.text.contains("。")) {
e.text = e.text.replace("。", ".");
}
}
String inputStr = e.text;
String originalStr = text.getText();
int start = e.start;
int end = e.end;
/**
* start == end 插入模式
* start < end 替换模式
*/
String resultStr = originalStr.substring(0, start) + inputStr + originalStr.substring(end);
if ("".equals(resultStr)) {
e.doit = true;
return;
} else {
Pattern pattern = Pattern.compile(regExp);
if (pattern.matcher(resultStr).matches()) {
e.doit = true;
return;
}
}
}
}
}
/**
* Launch the application
* @param args
*/
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application"); //$NON-NLS-1$
//
shell.open();
Text text = new Text(shell, SWT.BORDER);
new VerifyText(text, 2, 0);
text.setBounds(175, 110, 120, 30);
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
private Text text;//传入的组件,还可以是可书写下拉框等
private String regExp;//正则规则
public static final String REG_INT = "^([1-9]\\d*)|(0)|(-)|(-[1-9]\\d*)$"; // 整数
public static final String REG_NONNEGATIVEINT = "^([1-9]\\d*)|(0)$"; // 非负整数(正整数 + 0)
public static final String REG_POSITIVEINT = "^[1-9]\\d*$"; // 正整数
public static final String REG_NONPOSITIVEINT = "^(-)|(-[1-9]\\d*)|(0)$"; // 非正整数(负整数 + 0)
public static final String REG_NEGATIVEINT = "^(-)|(-[1-9]\\d*)$"; // 负整数
private int integerNum;//全局变量 正数位数
private int fractionNum;//全局变量 负数位数
/**
* 使用正则表达式进行用户输入验证
* @param text 传入的Text控件对象
* @param regExp 正则表达式字符串
*/
public VerifyText(Text text, String regExp) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener"); //$NON-NLS-1$
//如果有其他监听,清空,这个要看情况确定是否有,选加
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null); //$NON-NLS-1$
}
//主监听
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); //$NON-NLS-1
if (regExpVerifyListener != null) {
this.text.setData("DigitVerifyListener", null);
this.text.removeVerifyListener(regExpVerifyListener);
}
this.regExp = regExp;
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
/**
* 入口方法
* 给定整数和小数位数进行用户输入验证* @param text 传入的Text控件对象
* @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1
* @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1
* @param isPositive 是否形成正数,true 正数和零,false负数和零
*/
public VerifyText(Text text, int integerNum, int fractionNum, boolean isPositive) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener");
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null);
}
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener");
if (regExpVerifyListener != null) {
this.text.removeVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", null);
}
this.integerNum = integerNum;
this.fractionNum = fractionNum;
this.regExp = populateRegExp(isPositive) + "|" + "(0)";
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
/**
* 给定整数和小数位数进行用户输入验证(正负数,零均可)
* @param text 传入的Text控件对象
* @param integerNum 要求输入的整数部分的位数,如果不限制则输入-1
* @param fractionNum 要求输入的小数部分的位数,如果不限制则输入-1
*/
public VerifyText(Text text, int integerNum, int fractionNum) {
this.text = text;
UpperCaseVerifyListener upperCaseVerifyListener = (UpperCaseVerifyListener) text.getData(
"UpperCaseVerifyListener");
if (upperCaseVerifyListener != null) {
this.text.removeVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", null);
}
RegExpVerifyListener regExpVerifyListener = null;
regExpVerifyListener = (RegExpVerifyListener) this.text.getData("DigitVerifyListener"); //$NON-NLS-1$
if (regExpVerifyListener != null) {
this.text.removeVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", null);
}
this.integerNum = integerNum;
this.fractionNum = fractionNum;
this.regExp = populateRegExp(true) + "|" + "(0)" + "|" + populateRegExp(false);
;
//新建监听,将新建的class的参数传入新建的监听
regExpVerifyListener = new RegExpVerifyListener();
this.text.addVerifyListener(regExpVerifyListener);
this.text.setData("DigitVerifyListener", regExpVerifyListener);
if (upperCaseVerifyListener != null) {
this.text.addVerifyListener(upperCaseVerifyListener);
this.text.setData("UpperCaseVerifyListener", upperCaseVerifyListener);
}
}
//确定正则规则
private String populateRegExp(boolean isPositive) {
StringBuffer buffer = new StringBuffer();
buffer.append("^");
buffer.append(!isPositive ? "(-)|" : "");
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d*" + ")");
buffer.append("|");
} else if (integerNum > 0) {
buffer.append("(" + (!isPositive ? "-" : "") + "[1-9]\\d{0," + (integerNum - 1) + "}" + ")");
buffer.append("|");
}
if (fractionNum == -1) {
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")");
}
buffer.append("|");
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d*" + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + "\\d*"
+ ")"); //$NON-NLS-1$
}
} else if (fractionNum > 0) {
if (integerNum == -1) {
buffer.append("(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + ")");
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\." + ")");
}
buffer.append("|");
if (integerNum == -1) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d*))" + "\\." + "\\d{0," + (fractionNum - 1)
+ "}" + ")"); //$NON-NLS-1$ //$NON-NLS-2$
} else if (integerNum > 0) {
buffer.append(
"(" + (!isPositive ? "-" : "") + "((0)|([1-9]\\d{0," + (integerNum - 1) + "}))" + "\\."
+ "\\d{0," + fractionNum + "}" + ")");
}
}
buffer.append("$");
return buffer.toString();
}
//执行的监听
private class RegExpVerifyListener implements VerifyListener {
public void verifyText(VerifyEvent e) {
if (e.doit == true) {
e.doit = false;
if (fractionNum == -1 || fractionNum > 0) {
if (e.text.contains("。")) {
e.text = e.text.replace("。", ".");
}
}
String inputStr = e.text;
String originalStr = text.getText();
int start = e.start;
int end = e.end;
/**
* start == end 插入模式
* start < end 替换模式
*/
String resultStr = originalStr.substring(0, start) + inputStr + originalStr.substring(end);
if ("".equals(resultStr)) {
e.doit = true;
return;
} else {
Pattern pattern = Pattern.compile(regExp);
if (pattern.matcher(resultStr).matches()) {
e.doit = true;
return;
}
}
}
}
}
/**
* Launch the application
* @param args
*/
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application"); //$NON-NLS-1$
//
shell.open();
Text text = new Text(shell, SWT.BORDER);
new VerifyText(text, 2, 0);
text.setBounds(175, 110, 120, 30);
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}