构造vaadin 14文本字段,仅接受数字

时间:2019-11-02 08:36:07

标签: java vaadin

我需要制作仅接受数字的vaadin 14文本字段。该文本字段的标准如下

1。文本字段只能接受其他任何数字,因为我想将该文本字段用作手机号码字段。 2.validate的方式是,如果用户尝试输入字母,则文本字段中不得反映任何内容。仅允许在文本字段中输入数字。 3.任何警告或错误都不得在用户界面中显示,因为我们专门为手机号码设置了文本字段。

我尝试过的事情是活页夹,但是允许它们在焦点丢失事件生效后稍后输入字母,并提供我不希望出现的错误消息。

还尝试了vaadin数字字段,但是允许字符'e'

简单明了的我正在寻找只接受数字输入的文本字段。如果用户尝试输入字母,则文本字段中不会反映任何内容。

3 个答案:

答案 0 :(得分:3)

服务器端

您可以执行许多选择,第一个是answer by Alim Özdemir中已经提到的服务器端验证程序:

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

客户端

也有可能使用textField.setPattern(..)方法在客户端进行相同的检查和输入过滤,例如:

textFieldForNumber.setPreventInvalidInput(true);

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

NumberField

备用小部件:helloworld.azureapp.com?name={name}

第三种选择是使用NumberField组件。

答案 1 :(得分:1)

您可以使用资料夹之类的字段进行验证

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

答案 2 :(得分:1)

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

代码如下

@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();
    }

}

这实际上解决了我有关手机号码输入的问题。