在ComboBox上显示两个或多个属性?

时间:2014-08-26 19:42:07

标签: java vaadin7

我尝试在ComboBox上显示两个属性。我尝试了setItemCaptionPropertyId(),但这只显示nome,我想显示nomesobreNome或更多属性。

我正在尝试这个。

//jpacontainer aluno
private CustomJPAContainer<Aluno> dsAluno = new CustomJPAContainer<Aluno>(Aluno.class);

//combobox aluno
        ComboBox cbxAluno = (ComboBox)field;
        cbxAluno.setItemCaptionMode(ItemCaptionMode.PROPERTY);
        cbxAluno.setConverter(new SingleSelectConverter<Aluno>(cbxAluno));
        cbxAluno.setImmediate(true);
        cbxAluno.setContainerDataSource(dsAluno);
        cbxAluno.setItemCaptionPropertyId("nome");
        cbxAluno.setItemCaptionPropertyId("sobreNome");
        cbxAluno.setWidth("10cm");
        cbxAluno.addValueChangeListener(this);
        tabAluno.addComponent(cbxAluno);

//bean
@Entity
public class Aluno implements Serializable{ 
    private static final long serialVersionUID = 1L;

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @NotNull @NotEmpty @Size(min=3, max=50) 
    private String nome;

    @NotNull @NotEmpty @Size(min=3, max=50)
    private String sobreNome;   

}

我该怎么办?

**我解决了问题**

我创建了一个名为caption的新属性,并连接了我想要的字符串。 创建一个返回标题值的getCaption()之后;

解决方案。

@Transient
private String caption;

public String getCaption(){
   caption = nome + " " + sobreNome;
   return caption;
}

cbxAluno.setItemCaptionPropertyId("caption");

现在有效。!

3 个答案:

答案 0 :(得分:2)

我可能会说一些完全愚蠢的事情,但您是否尝试在班级toString中实施方法Aluno

答案 1 :(得分:0)

有人可能会创建一个级联组合框,您可以在其中选择Nome,并使用&#34; sobreNome&#34;填充第二个组合框。或者你必须将Nome和SobreNome的所有值连在一起。

答案 2 :(得分:0)

如果您可以使用自定义ComboBox,那么您可以这样做:

public class MyComboBox extends ComboBox {

    private static final long serialVersionUID = 1L;
    private List<String> myPropIds = Collections.emptyList();

    @Override
    public void setItemCaptionPropertyId(Object propId) {
        myPropIds = Arrays.asList(((String)propId).split(","));
    }

    @Override
    public String getItemCaption( Object itemId ) {
        StringBuilder sb = new StringBuilder();
        String delimiter = "";
        for (String propId : myPropIds) {
            Property<?> p = getContainerProperty(itemId, propId);
            sb.append(delimiter).append(getMyCaption(p));
            delimiter = " ";
        }
        return sb.toString();
    }

    private String getMyCaption(Property<?> p) {
        String caption = null;
        if (p != null) {
            Object value = p.getValue();
            if (value != null) {
                caption = value.toString();
            }
        }
        return caption != null ? caption : "";
    }

}

用法:

ComboBox cb = new MyComboBox();
cb.setItemCaptionPropertyId("nome,sobreNome");
//...