Frage

I need to set a value to a NativeSelect, setting the element i want it shows after i while i added items to the Select field. I can assume this as a good example for what i should accomplish:

public class TestselectUI extends UI {
@Override
protected void init(VaadinRequest request) {
    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    setContent(layout);

    NativeSelect sel = new NativeSelect();
    Customer c1 = new Customer("1", "Pippo");
    Customer c2 = new Customer("2", "Pluto");
    Customer c3 = new Customer("3", "Paperino");
    Customer c4 = new Customer("4", "Pantera");
    Customer c5 = new Customer("5", "Panda");

    sel.addItem(c1);
    sel.addItem(c2);
    sel.addItem(c3);
    sel.addItem(c4);
    sel.addItem(c5);

    Customer test = new Customer(c4.id, c4.name);
    sel.setValue(test);

    layout.addComponent(sel);
}

private class Customer {
    public String id;
    public String name;

    /**
     * @param id
     * @param name
     */
    public Customer(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return this.name;
    }

    @Override
    public boolean equals(final Object object) {
        // return true if it is the same instance
        if (this == object) {
            return true;
        }
        // equals takes an Object, ensure we compare apples with apples
        if (!(object instanceof Customer)) {
            return false;
        }
        final Customer other = (Customer) object;

        // implies if EITHER instance's name is null we don't consider them equal
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }

        return true;
    }
}
}

My problem is that the value in not set correctly and turns out always as null. Any tips for this issue?

War es hilfreich?

Lösung

In Java, hashCode() and equals() must be consistent :

Whenever a.equals(b), then a.hashCode() must be same as b.hashCode().

See the javadoc for Object#equals(Object) and this StackOverflow question for more discussison and reasoning.

So, in your example you need to implement hashCode() on Customer using both name and id (my IDE generated this code).

public class Customer {
  [...]

  @Override
  public int hashCode() {
    int result = id != null ? id.hashCode() : 0;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    return result;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top