TextField/Component 使用 Controls FX 进行验证
TextField/Component Validation with Controls FX
我正在尝试实现这样的文本字段:
TextField Validation http://imageshack.com/a/img537/8329/FSht8P.png
我的目标是确定 TextField 的文本是 Double
还是其他内容(然后它显示为红色)。
我想使用 ControlsFX 来学习库而不是编辑 css,但效果不是很好,我迷失在 javadoc 中。有没有人有示例或者可以帮助我改进我的代码?
这是我尝试做的事情:
Validator<Double> checkTextField = new Validator<Double>() {
@Override
public ValidationResult apply(Control t, Double u) {
ValidationResult vd = new ValidationResult();
if(Double.valueOf(t.toString()) != null){
vd.addErrorIf(t, "false", false);
}
return vd;
}
};
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.registerValidator(latitudeTextField, checkTextField/*Validator.createEmptyValidator("Text is required")*/);
ValidationDecoration iconDecorator = new GraphicValidationDecoration();
ValidationDecoration cssDecorator = new StyleClassValidationDecoration();
ValidationDecoration compoundDecorator = new CompoundValidationDecoration(cssDecorator, iconDecorator);
validationSupport.setValidationDecorator(compoundDecorator);
你确实犯了几个错误。首先你可以看看ControlsFX Showcase。他们的展示柜中总是有几个代码示例。
接下来您的示例希望 TextField 为验证器提供 Double,但您可能知道 TextField 本身仅使用字符串操作,因此您将需要一个字符串验证器。
然后您尝试 control.toString() 将打印的任何内容,这很可能不是它所代表的文本,而是有关控件本身的一些信息。你想要的是文本,它当前显示在文本字段中。为此,您不必询问控件,因为在您的情况下,文本值已经以值参数 'u' 的形式提供给您。
所以你现在要做的是,你想检查字符串是否可以解析为双精度数。从 Documention 你可以找到一个正则表达式来检查是否是这种情况(不知道是否有更好的正则表达式适合你的情况)。
所以总的来说它看起来像这样:
ValidationSupport support = new ValidationSupport();
Validator<String> validator = new Validator<String>()
{
@Override
public ValidationResult apply( Control control, String value )
{
boolean condition =
value != null
? !value
.matches(
"[\x00-\x20]*[+-]?(((((\p{Digit}+)(\.)?((\p{Digit}+)?)([eE][+-]?(\p{Digit}+))?)|(\.((\p{Digit}+))([eE][+-]?(\p{Digit}+))?)|(((0[xX](\p{XDigit}+)(\.)?)|(0[xX](\p{XDigit}+)?(\.)(\p{XDigit}+)))[pP][+-]?(\p{Digit}+)))[fFdD]?))[\x00-\x20]*" )
: value == null;
System.out.println( condition );
return ValidationResult.fromMessageIf( control, "not a number", Severity.ERROR, condition );
}
};
support.registerValidator( textfield, true, validator );
我正在尝试实现这样的文本字段:
TextField Validation http://imageshack.com/a/img537/8329/FSht8P.png
我的目标是确定 TextField 的文本是 Double
还是其他内容(然后它显示为红色)。
我想使用 ControlsFX 来学习库而不是编辑 css,但效果不是很好,我迷失在 javadoc 中。有没有人有示例或者可以帮助我改进我的代码?
这是我尝试做的事情:
Validator<Double> checkTextField = new Validator<Double>() {
@Override
public ValidationResult apply(Control t, Double u) {
ValidationResult vd = new ValidationResult();
if(Double.valueOf(t.toString()) != null){
vd.addErrorIf(t, "false", false);
}
return vd;
}
};
ValidationSupport validationSupport = new ValidationSupport();
validationSupport.registerValidator(latitudeTextField, checkTextField/*Validator.createEmptyValidator("Text is required")*/);
ValidationDecoration iconDecorator = new GraphicValidationDecoration();
ValidationDecoration cssDecorator = new StyleClassValidationDecoration();
ValidationDecoration compoundDecorator = new CompoundValidationDecoration(cssDecorator, iconDecorator);
validationSupport.setValidationDecorator(compoundDecorator);
你确实犯了几个错误。首先你可以看看ControlsFX Showcase。他们的展示柜中总是有几个代码示例。
接下来您的示例希望 TextField 为验证器提供 Double,但您可能知道 TextField 本身仅使用字符串操作,因此您将需要一个字符串验证器。
然后您尝试 control.toString() 将打印的任何内容,这很可能不是它所代表的文本,而是有关控件本身的一些信息。你想要的是文本,它当前显示在文本字段中。为此,您不必询问控件,因为在您的情况下,文本值已经以值参数 'u' 的形式提供给您。
所以你现在要做的是,你想检查字符串是否可以解析为双精度数。从 Documention 你可以找到一个正则表达式来检查是否是这种情况(不知道是否有更好的正则表达式适合你的情况)。
所以总的来说它看起来像这样:
ValidationSupport support = new ValidationSupport();
Validator<String> validator = new Validator<String>()
{
@Override
public ValidationResult apply( Control control, String value )
{
boolean condition =
value != null
? !value
.matches(
"[\x00-\x20]*[+-]?(((((\p{Digit}+)(\.)?((\p{Digit}+)?)([eE][+-]?(\p{Digit}+))?)|(\.((\p{Digit}+))([eE][+-]?(\p{Digit}+))?)|(((0[xX](\p{XDigit}+)(\.)?)|(0[xX](\p{XDigit}+)?(\.)(\p{XDigit}+)))[pP][+-]?(\p{Digit}+)))[fFdD]?))[\x00-\x20]*" )
: value == null;
System.out.println( condition );
return ValidationResult.fromMessageIf( control, "not a number", Severity.ERROR, condition );
}
};
support.registerValidator( textfield, true, validator );