Ваадин 7: TableFieldFactory

Есть ли способ внедрить интерфейс TableFactory с определенными полями, связанными с propertyId? Я получаю только один тип поля, так как я использую универсальный класс для всех своих таблиц, и мне не хватает логического значения CheckBox (отличный код):

class DefaultTableFieldFactory implements TableFieldFactory {
    @Override
    public Field<?> createField(Container container, Object itemId, Object propertyId, Component component) {
        TextField t = new TextField()

        switch(propertyId) {
            case "firstname": t.setNullRepresentation("");
            case "lastname": t.setNullRepresentation("");
            case "mobile": t.setNullRepresentation("");
            case "tel": t.setNullRepresentation("");
            case "email": t.setNullRepresentation("");
            default: break;
        }
        t.setWidth("95px")

        return t
    }
}

Поэтому мне нужно использовать этот класс выше, который реализует DefaultTableFieldfactory, чтобы иметь нулевое представление как «» (вместо «null») во всем моем приложении.

Цель состоит в том, чтобы предоставить для моих пользовательских компонентов (более 30) это нулевое представление в одном месте, я хочу использовать этот класс в качестве фабрики по умолчанию для каждой таблицы и подключить его, как я делал раньше:

def contacts = (Grails.get(FundService)).getAllContacts(fundId)
        def cContainer = new BeanItemContainer<Contact>(Contact.class,contacts)


        def t = new Table()
        t.containerDataSource = cContainer
        t.setTableFieldFactory(new DefaultTableFieldFactory())

person ludo_rj    schedule 20.12.2013    source источник


Ответы (1)


Vaadin предоставляет DefaultTableFieldFactory, который отображает

  • Дата в DateField
  • Логическое значение для флажка
  • другое для TextField

DefaultTableFieldFactory уже установлен в таблице. Итак, в вашем случае, если вы просто хотите иметь флажки для своих логических полей, я бы не стал реализовывать собственный TableFieldFactory. Вот пример:

Table table = new Table();

table.addContainerProperty("text", String.class, "");
table.addContainerProperty("boolean", Boolean.class, false);
table.setEditable(true);

Object itemId = table.addItem();
table.getItem(itemId).getItemProperty("text").setValue("has accepted");
table.getItem(itemId).getItemProperty("boolean").setValue(true);

Если вам действительно нужна собственная TableFieldFactory, Vaadin рекомендует:

Вы можете просто реализовать интерфейс TableFieldFactory, но мы рекомендуем вам расширить DefaultFieldFactory в соответствии с вашими потребностями. В реализации по умолчанию сопоставления определяются в методе createFieldByPropertyType() (вы можете посмотреть исходный код) как для таблиц, так и для форм.

В вашем коде, указанном в вопросе, вы всегда возвращаете TextField. Для ваших отсутствующих флажков вам нужно вернуть в конкретном случае CheckBox.

Не забывайте setEditable(true) при использовании FieldFactories.

Дополнительная информация здесь в разделе 5.16.3. Редактирование значений в таблице.

person nexus    schedule 21.12.2013
comment
Спасибо, но я уже знаю, что такое DefaultTableFactory, так как реализую его в своем коде. Цель здесь состоит в том, чтобы предоставить этой фабрике возможность обрабатывать различные типы полей в одной фабрике и применить этот шаблон к источнику данных контейнера таблицы (см. код, измененный выше). - person ludo_rj; 21.12.2013
comment
@ludo_rj Тогда взгляните на метод createFieldByType() в классе DefaultFieldFactory, предоставленном Vaadin, который при необходимости возвращает CheckBox. - person nexus; 21.12.2013
comment
да, это то, что я искал :) Поскольку DefaultFieldFactory.createFieldByPropertyType является статическим, его нельзя переопределить, поэтому для правильной реализации в TableFieldFactory требуется дополнительный код. - person ludo_rj; 21.12.2013
comment
@ludo_rj ну, я уже упоминал об этом в своем ответе, если вы внимательно посмотрите на это. - person nexus; 21.12.2013