java - 如何在选择模式下使用多个ID "Property"

标签 java selection vaadin vaadin7

我有一个选择组件(具体来说是一个组合框),并添加了一个 SQLContainer 作为 ContainerDataSource。

我已通过 .setItemCaptionPropertyId("myID") 设置 ItemCaption。但是,我需要使用两个属性作为标题。

假设 ID 为“myID”的属性表示类似“foo”的字符串。还有另一个名为“myCodeID”的属性,它代表“23”等数字。

我怎样才能让我的组合框将其项目的标题显示为“23 foo”?

我正在搜索类似 .setItemCaptionPropertyIds("myId", "myCodeID") 的内容。

最佳答案

我相信您可以使用多种方法,但至少以下两种方法有效:

1) 快速且

如何使用“假属性”,这意味着您使用对象上实际不存在的属性,有一个具有该名称的 getter。自 Vaadin will also look for getters/setters当确定项目属性时,它会找到它并将其用于您的标题。

我知道这不是最优雅的修改模型类的方法,但它可以帮助您实现这一点。此外,根据您的实现,您可以使用包含 getCaption() 方法的 PersonCaptionGenerator 来装饰您的 Person,以保持事物的独立性。

假设你有一个像这样的bean:

public static class Person {
        private String name, surname;
        private int age;

        public Person(String name, String surname, int age) {
            this.name = name;
            this.surname = surname;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public String getSurname() {
            return surname;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setSurname(String surname) {
            this.surname = surname;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getCaption() {
            // getter to be used as caption
            return name + " " + surname;
        }
    }

然后你可以这样写:

public class ComboBoxComponent extends VerticalLayout {
    public ComboBoxComponent() {
        BeanItemContainer<Person> dataSource = new BeanItemContainer<>(HasCaption.class);

        ComboBox comboBox = new ComboBox();
        comboBox.setItemCaptionMode(AbstractSelect.ItemCaptionMode.PROPERTY);

        // use a fake property which will get identified by the getter
        comboBox.setItemCaptionPropertyId("caption");
        addComponent(comboBox);

        comboBox.setContainerDataSource(dataSource);
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            dataSource.addBean(new Person("Name " + i, "Surname " + i, random.nextInt(99) + 1));
        }
    }
}
<小时/>

2) 扩展组合并添加标题生成器

如果您无法修改模型并拥有某种通用且可重用的解决方案,则可以扩展 ComboBox 并重写 getItemCaption() 方法。请注意,我使用了 BeanItemContainer,因为它更容易,因为它将 bean 本身保存为项目 ID,但如果需要不同的容器,则可能可以对其进行调整。

从相同的 Person bean 开始,但没有 fake 属性的 getter。

通用契约(Contract):

public interface CaptionComposer<T> {
    String getCaption(T item);
}

我们的 Person bean 的实现:

private class PersonCaptionGenerator implements CaptionComposer<Person> {
    @Override
    public String getCaption(Person person) {
        return person.getName() + " " + person.getSurname();
    }
}

自定义组合框将标题检索推迟到生成器:

public static class MyComboBox<T> extends ComboBox {
    private CaptionComposer captionComposer;

    public MyComboBox(CaptionComposer<T> captionGenerator, BeanItemContainer<T> dataSource) {
        this.captionComposer = captionGenerator;
        setContainerDataSource(dataSource);
    }

    @Override
    public String getItemCaption(Object itemId) {
        return captionComposer.getCaption(itemId);
    }
}

最后,将其添加到 UI:

public class ComboBoxComponent extends VerticalLayout {
    public ComboBoxComponent() {
        BeanItemContainer<Person> dataSource = new BeanItemContainer<>(Person.class);

        addComponent(new MyComboBox<>(new PersonCaptionGenerator(), dataSource));

        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            dataSource.addBean(new Person("Name " + i, "Surname " + i, random.nextInt(99) + 1));
        }
    }
}
<小时/>

最终两者都会得到你:

Result

关于java - 如何在选择模式下使用多个ID "Property",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33240847/

相关文章:

WPF 数据网格 : How to clear selection programmatically?

java - Vaadin(流): Navigating to destination with a shared object

java - Eclipse 火星 : Unable to read repository at http://vaadin. com/eclipse/plugins

java - fasterxml JsonInclude 可选

java - 在Java中打印排序数组

java - 如何在 AWS Java SDK v2 Apache 客户端上设置代理

java - 如何更改速度模板中的小数分隔符?

c# - 寻找中位数的选择算法

svn - 选择 Subversion 服务器

css - Vaadin 网格布局边框