Javafx 使用FX控件验证文本字段/组件

Javafx 使用FX控件验证文本字段/组件,javafx,controlsfx,Javafx,Controlsfx,我正在尝试实现一个文本字段,如下所示: 我的目标是确定TextField的文本是Double还是其他内容(然后显示为红色)。 我想使用ControlsFX来学习这个库,而不是编辑css,但是它工作得不是很好,我在javadoc中迷失了方向。是否有人提供了示例,或者可以帮助我改进代码 下面是我试图做的: Validator<Double> checkTextField = new Validator<Double>() { @Override

我正在尝试实现一个文本字段,如下所示:

我的目标是确定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);
Validator checkTextField=new Validator(){
@凌驾
公共验证结果应用(控制t,双u){
ValidationResult vd=新的ValidationResult();
if(Double.valueOf(t.toString())!=null){
vd.addErrorIf(t,“假”,假);
}
返回vd;
}
};
ValidationSupport ValidationSupport=新的ValidationSupport();
validationSupport.registerValidator(latitudeTextField,checkTextField/*Validator.createEmptyValidator(“需要文本”)*/);
ValidationDecoration ICondcorator=新图形ValidationDecoration();
ValidationDecoration cssDecorator=新样式classvalidationdecoration();
ValidationDecoration compoundDecorator=新的CompoundValidationDecoration(cssDecorator、iconDecorator);
setValidationDecorator(compoundDecorator);

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

接下来,您的示例希望TextField向验证程序提供双精度验证,但您可能知道TextField本身只对字符串进行操作,因此您需要一个字符串验证程序

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

现在要做的是,检查字符串是否可以解析为double。从中,您可以找到一个正则表达式来检查是否是这种情况(不知道是否有更好的正则表达式适合您的情况)

因此,总的来说,它可能是这样的:

    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 );
ValidationSupport=new ValidationSupport();
验证器验证器=新验证器()
{
@凌驾
公共验证结果应用(控件、字符串值)
{
布尔条件=
值!=null
价值
.火柴(
[[[0.0 0 0 0....除了除了除了除了上述两个学校的[[0 0 0.....................................除了除了除了除了除了........0.[[[[[[0.p.数字.......................................................................................................................................................}+)[fFdD]?)[\\x00-\\x20]*”)
:value==null;
系统输出打印项次(条件);
返回ValidationResult.fromMessageIf(控制,“非数字”、严重性、错误、条件);
}
};
support.registerValidator(textfield,true,validator);

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

接下来,您的示例希望TextField向验证程序提供双精度验证,但您可能知道TextField本身只对字符串进行操作,因此您需要一个字符串验证程序

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

现在要做的是,检查字符串是否可以解析为double。从中,您可以找到一个正则表达式来检查是否是这种情况(不知道是否有更好的正则表达式适合您的情况)

因此,总的来说,它可能是这样的:

    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 );
ValidationSupport=new ValidationSupport();
验证器验证器=新验证器()
{
@凌驾
公共验证结果应用(控件、字符串值)
{
布尔条件=
值!=null
价值
.火柴(
[[[0.0 0 0 0....除了除了除了除了上述两个学校的[[0 0 0.....................................除了除了除了除了除了........0.[[[[[[0.p.数字.......................................................................................................................................................}+)[fFdD]?)[\\x00-\\x20]*”)
:value==null;
系统输出打印项次(条件);
返回ValidationResult.fromMessageIf(控制,“非数字”、严重性、错误、条件);
}
};
support.registerValidator(textfield,true,validator);

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

接下来,您的示例希望TextField向验证程序提供双精度验证,但您可能知道TextField本身只对字符串进行操作,因此您需要一个字符串验证程序

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

现在要做的是,检查字符串是否可以解析为double。从中,您可以找到一个正则表达式来检查是否是这种情况(不知道是否有更好的正则表达式适合您的情况)

所以总的来说它看起来像这样