验证控件中的可观察值fx

Observable value in validation controlsfx

我有以下代码

  public ValidationResult notNull(Control control, String content) {
        boolean condition = content.length() <=0;
        return ValidationResult.fromMessageIf(control, "Field is empty!", Severity.WARNING, condition);
    }

它检查文本字段中是否有任何字符,

我这样称呼它

validator = new ValidationSupport();

validator.registerValidator(itemIdTf,vals::notNull);

最后是这样做

validator.invalidProperty().addListener((observable, oldValue, newValue) -> {
            itemIdTf.pseudoClassStateChanged(PseudoClass.getPseudoClass("negative"), oldValue);});

这行得通,它为某些控件设置了伪 class,但是当我在同一个验证器上只有很少的文本字段控件时,它必须等待所有控件都经过验证才能更改伪 class.

所以我想也许可以在 ValidationResult 方法中执行此操作,因为我认为使用多个验证器可能并不好。我怎么不知道这是否可能,我需要一些对每个控件都是唯一的监听器,而不是用于验证结果。

好吧,我找到了一些有用的东西,但它仍然留下了一些未解决的问题:

  public ValidationResult notNull(Control control, String content) {



        boolean condition = content.length() <=0;

      control.pseudoClassStateChanged(positive,!condition);

        return ValidationResult.fromMessageIf(control, "Field is empty!", Severity.ERROR, condition);
    }

我正在使用 css 样式验证器,所以来自这一行的东西不起作用(至少不是全部)

return ValidationResult.fromMessageIf(control, "Field is empty!", Severity.ERROR, bp.getValue());

上面有字符串 "Field is empty",它应该是控件的工具提示,但它从未设置过,所以我只是在验证中创建了自己的工具提示,并将其添加到控件中。

然后整个事情看起来像这样:

PseudoClass positive = PseudoClass.getPseudoClass("positive");
    final Tooltip notNullTooltip = new Tooltip("Must have some value");
      public ValidationResult notNull(Control control, String content) {

            boolean condition = content.length() <=0;

          control.pseudoClassStateChanged(positive,!condition);
          control.setTooltip(notNullTooltip);
            return ValidationResult.fromMessageIf(control, "Field is empty!", Severity.ERROR, condition);
        }

它确实有效,如果有人有更优雅的解决方案,我将不胜感激。