1

我需要为 NativeSelect 设置一个值,设置我希望它在我将项目添加到 Select 字段后显示的元素。我可以假设这是我应该完成的一个很好的例子:

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

我的问题是值设置不正确,结果总是为空。这个问题的任何提示?

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 回答