代码之家  ›  专栏  ›  技术社区  ›  kushal Baldev

构造vaadin 14 Textfield,它只接受数字,不接受其他内容

  •  0
  • kushal Baldev  · 技术社区  · 5 年前

    1.textfield必须只接受数字,不接受任何其他内容,因为我想将该textfield用作手机号码字段。 2.以这样一种方式进行验证:如果用户试图输入字母,文本字段中不得反映任何内容。文本字段中只能输入数字。

    我尝试过的是binders,但它允许在焦点丢失事件之后输入字母表,它们验证并提供错误消息我不希望出现这种行为。

    还尝试了vaadin数字字段,但允许字符“e”

    简单而直接地说,我正在寻找只需要输入数字的文本字段。如果用户尝试输入字母,文本字段中不必反映任何内容。

    0 回复  |  直到 5 年前
        1
  •  6
  •   Tatu Lund    5 年前

    answer by Alim Özdemir :

    binder.forField(textFieldForNumber)
          .withValidator(new RegexpValidator("Only 1-9 allowed","\\d*"))
          .bind(YourEntity::getNo, YourEntity::setNo);
    

    客户端

    也有可能在客户端使用 textField.setPattern(..) 方法,例如:

    textFieldForNumber.setPattern("\\d*");
    

    此外,还可以通过以下方式防止输入与模式不匹配:

    textFieldForNumber.setPreventInvalidInput(true);
    

    备用小部件: NumberField

    第三种选择是使用 NumberField

        2
  •  1
  •   Alim Özdemir    5 年前

    你可以用活页夹在现场进行验证

    binder.forField(textFieldForNumber)
          .withValidator(new RegexpValidator("Only 1-9 allowed","\\d*"))
          .bind(YourEntity::getNo, YourEntity::setNo);
    
        3
  •  1
  •   kushal Baldev    5 年前

    我找到了答案的解决方案,我在Vaadin的新beta版本中提取了整数文本字段的源代码

    代码如下

    @Tag("vaadin-integer-field")
    @HtmlImport("frontend://bower_components/vaadin-text-field/src/vaadin-integer-field.html")
    @JsModule("@vaadin/vaadin-text-field/src/vaadin-integer-field.js")
    public class BigIntegerField extends AbstractNumberField<BigIntegerField, BigInteger> {
    
        private static final SerializableFunction<String, BigInteger> PARSER = valueFormClient -> {
            if (valueFormClient == null || valueFormClient.isEmpty()) {
                return null;
            }
            try {
                return new BigInteger(valueFormClient);
            } catch (NumberFormatException e) {
                return null;
            }
        };
    
        private static final SerializableFunction<BigInteger, String> FORMATTER = valueFromModel -> valueFromModel == null
                ? ""
                : valueFromModel.toString();
    
        /**
         * Constructs an empty {@code IntegerField}.
         */
        public BigIntegerField() {
    
              super(PARSER, FORMATTER, Double.MIN_VALUE, Double.MAX_VALUE);
      //      super(PARSER, FORMATTER, new BigInteger(String.valueOf(Integer.MIN_VALUE)), new BigInteger(String.valueOf(Integer.MAX_VALUE)));
        }
    
        /**
         * Constructs an empty {@code IntegerField} with the given label.
         *
         * @param label
         *            the text to set as the label
         */
        public BigIntegerField(String label) {
            this();
            setLabel(label);
        }
    
        /**
         * Constructs an empty {@code IntegerField} with the given label and
         * placeholder text.
         *
         * @param label
         *            the text to set as the label
         * @param placeholder
         *            the placeholder text to set
         */
        public BigIntegerField(String label, String placeholder) {
            this(label);
            setPlaceholder(placeholder);
        }
    
        /**
         * Constructs an empty {@code IntegerField} with a value change listener.
         *
         * @param listener
         *            the value change listener
         *
         * @see #addValueChangeListener(ValueChangeListener)
         */
        public BigIntegerField(
                ValueChangeListener<? super ComponentValueChangeEvent<BigIntegerField, BigInteger>> listener) {
            this();
            addValueChangeListener(listener);
        }
    
        /**
         * Constructs an empty {@code IntegerField} with a value change listener and
         * a label.
         *
         * @param label
         *            the text to set as the label
         * @param listener
         *            the value change listener
         *
         * @see #setLabel(String)
         * @see #addValueChangeListener(ValueChangeListener)
         */
        public BigIntegerField(String label,
                ValueChangeListener<? super ComponentValueChangeEvent<BigIntegerField, BigInteger>> listener) {
            this(label);
            addValueChangeListener(listener);
        }
    
        /**
         * Constructs a {@code IntegerField} with a value change listener, a label
         * and an initial value.
         *
         * @param label
         *            the text to set as the label
         * @param initialValue
         *            the initial value
         * @param listener
         *            the value change listener
         *
         * @see #setLabel(String)
         * @see #setValue(Object)
         * @see #addValueChangeListener(ValueChangeListener)
         */
        public BigIntegerField(String label, BigInteger initialValue,
                ValueChangeListener<? super ComponentValueChangeEvent<BigIntegerField, BigInteger>> listener) {
            this(label);
            setValue(initialValue);
            addValueChangeListener(listener);
        }
    
        /**
         * Sets the minimum value of the field. Entering a value which is smaller
         * than {@code min} invalidates the field.
         * 
         * @param min
         *            the min value to set
         */
        public void setMin(int min) {
            super.setMin(min);
        }
    
        /**
         * Gets the minimum allowed value of the field.
         *
         * @return the min property of the field
         * @see #setMin(int)
         */
        public int getMin() {
            return (int) getMinDouble();
        }
    
        /**
         * Sets the maximum value of the field. Entering a value which is greater
         * than {@code max} invalidates the field.
         *
         * @param max
         *            the max value to set
         */
        public void setMax(int max) {
            super.setMax(max);
        }
    
        /**
         * Gets the maximum allowed value of the field.
         *
         * @return the max property of the field
         * @see #setMax(int)
         */
        public int getMax() {
            return (int) getMaxDouble();
        }
    
        /**
         * Sets the allowed number intervals of the field. This specifies how much
         * the value will be increased/decreased when clicking on the
         * {@link #setHasControls(boolean) control buttons}. It is also used to
         * invalidate the field, if the value doesn't align with the specified step
         * and {@link #setMin(int) min} (if specified by user).
         * 
         * @param step
         *            the new step to set
         * @throws IllegalArgumentException
         *             if the argument is less or equal to zero.
         */
        public void setStep(int step) {
            if (step <= 0) {
                throw new IllegalArgumentException("The step cannot be less or equal to zero.");
            }
            super.setStep(step);
        }
    
        /**
         * Gets the allowed number intervals of the field.
         *
         * @return the step property of the field
         * @see #setStep(int)
         */
        public int getStep() {
            return (int) getStepDouble();
        }
    
    }