0

我正在尝试实现一个像这样的文本字段:

文本字段验证 http://imageshack.com/a/img537/8329/FSht8P.png

我的目标是确定 TextField 的文本是 aDouble还是其他东西(然后它显示为红色)。我想使用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);
4

1 回答 1

3

你确实犯了几个错误。首先你可以看看ControlsFX Showcase。他们的展示中总是有几个代码示例。

接下来,您的示例期望 TextField 为验证器提供 Double,但您可能知道 TextField 本身仅使用字符串操作,因此您将需要一个字符串验证器。

然后您尝试任何 control.toString() 将打印的内容,这很可能不是它所代表的文本,而是有关控件本身的一些信息。您想要的是当前显示在文本字段中的文本。为此,您不必询问控件,因为在您的情况下,文本值已经以值参数“u”的形式提供给您。

所以你现在想要做的是,你想要检查字符串是否可以被解析成双精度。从文档中,您可以找到一个正则表达式来检查是否是这种情况(不知道您的情况是否有更好的正则表达式)。

所以总的来说,它可能看起来像这样:

    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 );
于 2015-04-13T16:01:00.520 回答