12

Vaadin テキスト フィールドを使用していますが、サポートする数値のみを制限したいと考えています。setValue()スーパーを呼び出さずにオーバーライドして返そうとしました。setValue() テキストが数値でない場合。しかし、それは機能していないようです。どうすればこれを修正できますか? 私は Vaadin 7 を使用しています。また、NumberField もサポートしていないと思います。

4

7 に答える 7

4

Vaadin 7 では、TextField を使用し、数値のみを許可するようにバリデーターを設定できます。

TextField textField;
textField.addValidator(new RegexpValidator("[-]?[0-9]*\\.?,?[0-9]+"), "This is not a number!");

必要に応じて正規表現を変更してください。まだ文字列を処理しているため、TextField の戻り値を変換する必要があることに注意してください。

Long.parseLong(textField.getValue())
于 2015-10-27T15:58:18.843 に答える
2

ATextFieldは、常に type の値を持つコンポーネントですString。別のタイプのプロパティをテキスト フィールドにバインドする場合、2 つのタイプ間の変換がサポートされている場合、値は自動的に変換されます。

public class MyBean {
    private int value;

    public int getValue() {
        return value;
    }

    public void setValue(int integer) {
        value = integer;
    }
}

BeanItemから構築された「値」という名前のプロパティMyBeanは、型になりIntegerます。プロパティを にバインドするTextFieldと、整数に変換できないテキストの検証が自動的に失敗します。

final MyBean myBean = new MyBean();

BeanItem<MyBean> beanItem = new BeanItem<MyBean>(myBean);

final Property<Integer> integerProperty = (Property<Integer>) beanItem
        .getItemProperty("value");
final TextField textField = new TextField("Text field", integerProperty);

Button submitButton = new Button("Submit value", new ClickListener() {
    public void buttonClick(ClickEvent event) {
        String uiValue = textField.getValue();
        Integer propertyValue = integerProperty.getValue();
        int dataModelValue = myBean.getValue();

        Notification.show("UI value (String): " + uiValue
                + "\nProperty value (Integer): " + propertyValue
                + "\nData model value (int): " + dataModelValue);
     }
});

addComponent(new Label("Text field type: " + textField.getType()));
addComponent(new Label("Text field type: " + integerProperty.getType()));
addComponent(textField);
addComponent(submitButton);

この例では、数値を入力してボタンを押すと、 の値がTextFieldになりString、プロパティ値はInteger同じ値を表す になり、Bean の値は同じ int になります。たとえば、フィールドに文字を入力してボタンを押すと、検証は失敗します。これにより、フィールドに通知が表示されます。フィールド値は引き続き更新されますが、プロパティ値と Bean 値は以前の値のままです。

于 2013-06-17T10:04:35.483 に答える
2

これは、@raffael の回答の更新 (vaadin 8 を使用した 2017) です。

public class DoubleField extends TextField implements ValueChangeListener<String>  {

public String lastValue;

public DoubleField() {
    setValueChangeMode(ValueChangeMode.EAGER);
    addValueChangeListener(this);
    lastValue="";
}

@Override
public void valueChange(ValueChangeEvent<String> event) {
    String text = (String) event.getValue();
    try {
        new Double(text);
        lastValue = text;
    } catch (NumberFormatException e) {
        setValue(lastValue);
    }

}
于 2017-06-18T12:27:11.283 に答える