Шаблонирование поля члена в пользовательском виджете? - PullRequest
0 голосов
/ 28 ноября 2011

Я работаю над пользовательским виджетом, который я называю SelectionField, который (вкратце) добавляет функциональность к ListBox, главным образом для поддержки нашего интерфейса HasDisplayText. Вот метод, который объяснит, что я имею в виду:

public <T extends Enum<?> & HasDisplayText> void addItems(T [] items) {
    if (items != null && items.length > 0) {
        for (T item : items) {
            selectionField.addItem(item.getDisplayText(), item.name()); 
        }
    }
}

Я называю этот метод так:

selectionField.addItems(TimeZone.values());

Я хотел бы иметь свойство (с getter / setter) enumClass, которое позволяет пользователю вызывать setEnumClass(TimeZone). У меня возникают проблемы с выяснением, как это можно сделать, при этом гарантируя, что входящий класс Enum определенно реализует HasDisplayText.

Это работает:

public <T extends Enum<?> & HasDisplayText> void setEnumClass(Class<T> enumClass) {
    if (enumClass != null) {
        T[] constants = enumClass.getEnumConstants();
        addItems(constants);
    }
}

... но теперь я хотел бы объявить поле члена this.enumClass, чтобы оно могло быть установлено на входящее enumClass. Очевидно, private <T extends Enum<?> & HasDisplayText> Class<T> enumClass не работает. Я могу просто объявить поле как private Class<?> enumClass, обязательно выполнить проверку входящего класса и привести его к возвращению из метода получения, но это выглядит скорее как обходной путь, чем правильный подход.

(В качестве бонуса я также хотел бы иметь возможность редактировать это свойство в UiBinder или даже в GWT Designer, если это возможно.)

Как это можно сделать?

1 Ответ

1 голос
/ 30 ноября 2011

Является ли создание общего класса виджетов опцией для вас?Если это так, это должно работать:

public class GenericBinderComposite<T extends Enum<?> & HasDisplayText> extends Composite {

   private static GenericBinderCompositeUiBinder uiBinder = GWT.create(GenericBinderCompositeUiBinder.class);
   interface GenericBinderCompositeUiBinder extends UiBinder<Widget, GenericBinderComposite<?>> {}   

   private T enumClass;

   public GenericBinderComposite() {
      initWidget(uiBinder.createAndBindUi(this));
   }
   public T getEnumClass() {
      return enumClass;
   }
   public void setEnumClass(T enumClass) {
      this.enumClass = enumClass;
   }

}

Вышесказанное подразумевает присутствие GenericBinderComposite.ui.xml, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...