Creating your own converter for String - MyType conversion

If you have custom types that you want to represent using the built in field components, you can easily create your own converter to take care of converting between your own type and the native data type of the field.

A sample custom type, in this case a Name object with separate fields for first and last name.

public class Name {
  private String firstName;
  private String lastName;

  public Name(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
}

A converter for the name, assuming the parts are separated with a space and that there are only two parts of a name.

public class StringToNameConverter implements Converter<String, Name> {
  public Name convertToModel(String text, Locale locale)
      throws ConversionException {
    if (text == null) {
      return null;
    }
    String[] parts = text.split(" ");
    if (parts.length != 2) {
      throw new ConversionException("Can not convert text to a name: " + text);
    }
    return new Name(parts[0], parts[1]);
  }

  public String convertToPresentation(Name name, Locale locale)
      throws ConversionException {
    if (name == null) {
      return null;
    } else {
      return name.getFirstName() + " " + name.getLastName();
    }
  }

  public Class<Name> getModelType() {
    return Name.class;
  }

  public Class<String> getPresentationType() {
    return String.class;
  }
}

Hooking up the Name type and its Converter to a TextField can then be done like this

Name name = new Name("Rudolph", "Reindeer");

final TextField textField = new TextField("Name");
textField.setConverter(new StringToNameConverter());
textField.setConvertedValue(name);

addComponent(textField);
addComponent(new Button("Submit value", new ClickListener() {
  public void buttonClick(ClickEvent event) {
    try {
      Name name = (Name) textField.getConvertedValue();
      Notification.show(
              "First name: " + name.getFirstName() +
              "<br />Last name: " + name.getLastName());
    } catch (ConversionException e) {
      Notification.show(e.getCause().getMessage());
    }
  }
}));