Vaadin テキスト フィールドを使用していますが、サポートする数値のみを制限したいと考えています。setValue()
スーパーを呼び出さずにオーバーライドして返そうとしました。setValue()
テキストが数値でない場合。しかし、それは機能していないようです。どうすればこれを修正できますか? 私は Vaadin 7 を使用しています。また、NumberField もサポートしていないと思います。
7 に答える
Vaadin 7 では、TextField を使用し、数値のみを許可するようにバリデーターを設定できます。
TextField textField;
textField.addValidator(new RegexpValidator("[-]?[0-9]*\\.?,?[0-9]+"), "This is not a number!");
必要に応じて正規表現を変更してください。まだ文字列を処理しているため、TextField の戻り値を変換する必要があることに注意してください。
Long.parseLong(textField.getValue())
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 値は以前の値のままです。
これは、@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);
}
}