1

値を NativeSelect に設定する必要があります。選択フィールドに項目を追加しているときに表示したい要素を設定します。私が達成すべきことの良い例として、これを想定できます:

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;
    }
}
}

私の問題は、値が正しく設定されておらず、常にnullになることです。この問題のヒントはありますか?

4

1 に答える 1

1

Java では、hashCode()一貫equals()性がなければなりません:

a.equals(b) の場合、a.hashCode() は b.hashCode() と同じでなければなりません。

Object#equals(Object) の javadocとこのStackOverflow の質問を参照して、詳細な議論と理由を確認してください。

したがって、あなたの例では、 name と id の両方を使用して Customer に hashCode() を実装する必要があります (私の IDE はこのコードを生成しました)。

public class Customer {
  [...]

  @Override
  public int hashCode() {
    int result = id != null ? id.hashCode() : 0;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    return result;
  }
}
于 2013-06-25T14:10:18.590 に答える