createField() を使用してフィールドを作成するテーブルがあります。編集モードでは、ユーザーはフィールドにテキストを入力できます。
このテーブルの列の 1 つは整数のみを許可する必要があるため、IntegerRangeValidator を使用しています。
検証は動的 (入力時) である必要があり、入力が false であると検証された場合は、小さな赤い感嘆符が表示され、ツールチップには「整数のみが許可されています!」のようなメッセージが表示されます。これらの感嘆符を表示し、この動的な検証を行えるようにするには、200 ミリ秒ごとに textChanges をリッスンするラッパーを使用する必要がありました。
問題は、TextField が文字列を返すため、ユーザーがフィールドに整数を入力した場合でも、バリデーターはすべてを文字列として解釈することです。
Vaadin 7 - 検証がラッパーのオーバーライドされた textChange-method で実行されるときに、テーブル内にある TextField からの整数を検証するにはどうすればよいですか?
createField メソッド:
@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {
TextField tField = null;
tField = (TextField) super.createField(container, itemId, propertyId, uiContext);
tField.setBuffered(true);
addFieldListeners(tField);
if (propertyId.equals("age") {
tField.setRequired(true);
tField.setRequiredError("This field is required!");
// tField.setConverter(new StringToIntegerConverter()); <-- I also tried this, without success
tField.addValidator(new IntegerRangeValidator("Only Integers allowed!", 1, 150));
@SuppressWarnings({ "unchecked", "rawtypes" })
TableDataValidatingWrapper<TextField> wField = new TableDataValidatingWrapper(tField);
return wField;
} else {
return null;
}
}
ラッパー:
public class TableDataValidatingWrapper<T> extends CustomField<T> {
private static final long serialVersionUID = 1L;
protected Field<T> delegate;
public TableDataValidatingWrapper(final Field<T> delegate) {
this.delegate = delegate;
if (delegate instanceof TextField) {
final TextField textField = (TextField) delegate;
textField.setTextChangeEventMode(AbstractTextField.TextChangeEventMode.TIMEOUT);
textField.setTextChangeTimeout(200);
textField.setCaption("");
textField.addTextChangeListener(new FieldEvents.TextChangeListener() {
private static final long serialVersionUID = 1L;
@Override
public void textChange(FieldEvents.TextChangeEvent event) {
try {
textField.setValue(event.getText());
textField.validate();
} catch (EmptyValueException e) {
System.out.println("Caught exception " + e);
} catch (InvalidValueException e) {
System.out.println("Caught exception " + e);
} catch (Exception e) {
System.out.println("Caught unknown exception " + e);
}
}
});
}
}
// ... some other overridden methods
}