5.5.2.1.28. PickerField

PickerField позволяет отображать экземпляр сущности в текстовом поле и выполнять действия нажатием на кнопки справа.

PickerField

XML-имя компонента: pickerField.

Компонент PickerField реализован для блоков Web Client и Desktop Client.

  • Как правило, PickerField используется для работы со ссылочными атрибутами сущностей. При этом компоненту достаточно указать атрибуты datasource и property:

    <dsContext>
        <datasource id="carDs" class="com.company.sample.entity.Car" view="_local"/>
    </dsContext>
    <layout>
        <pickerField datasource="carDs" property="colour"/>

    Как видно из примера, в экране описывается источник данных carDs для некоторой сущности Car, имеющей атрибут colour. В элементе pickerField в атрибуте datasource указывается ссылка на источник данных, а в атрибуте property − название атрибута сущности, значение которого должно быть отображено в компоненте. Атрибут сущности должен являться ссылкой на другую сущность, в приведенном примере это Colour.

  • Для PickerField можно определить произвольное количество действий, отображаемых кнопками справа.

    Это можно сделать как в XML-дескрипторе с помощью вложенного элемента actions, так и программно в контроллере методом addAction().

    • Существуют стандартные действия, определенные перечислением PickerField.ActionType: lookup, clear, open. Они выполняют соответственно выбор связанной сущности, очистку поля и открытие экрана редактирования выбранной связанной сущности. Для стандартных действий в XML не нужно определять никаких атрибутов, кроме идентификатора. Если при объявлении компонента никаких действий в элементе actions не задано, загрузчик XML определит для него действия lookup и clear. Чтобы добавить к действиям по умолчанию, например, действие open, нужно определить элемент actions следующим образом:

      <pickerField datasource="carDs" property="colour">
          <actions>
              <action id="lookup"/>
              <action id="open"/>
              <action id="clear"/>
          </actions>
      </pickerField>

      Элемент action не дополняет, а переопределяет набор стандартных действий, поэтому необходимо указывать идентификаторы всех требуемых действий. Компонент примет следующий вид:

      gui pickerFieldActionsSt

      Для программного задания стандартных действий служат методы addLookupAction(), addOpenAction() и addClearAction(). Если компонент определен в XML-дескрипторе без вложенного элемента actions, то достаточно добавить недостающие действия:

      @Inject
      protected PickerField colourField;
      
      @Override
      public void init(Map<String, Object> params) {
          colourField.addOpenAction();
      }

      Если же компонент создается в контроллере, то никаких действий по умолчанию он не получает, и необходимо добавить все нужные действия явно:

      @Inject
      protected ComponentsFactory componentsFactory;
      
      @Override
      public void init(Map<String, Object> params) {
          PickerField colourField = componentsFactory.createComponent(PickerField.NAME);
          colourField.setDatasource(carDs, "colour");
          colourField.addLookupAction();
          colourField.addOpenAction();
          colourField.addClearAction();
      }

      Стандартные действия можно параметризовать. В XML-дескрипторе возможности для этого ограничены: существует только атрибут openType, в котором можно задать режим открытия экрана выбора (для LookupAction) или редактирования (для OpenAction).

      При программном создании действий можно задать любые свойства объектов PickerField.LookupAction, PickerField.OpenAction и PickerField.ClearAction, возвращаемых методами добавления стандартных действий. Например, так можно задать специфический экран выбора:

      PickerField.LookupAction lookupAction = customerField.addLookupAction();
      lookupAction.setLookupScreen("customerLookupScreen");

      Подробнее см. JavaDocs классов стандартных действий.

    • Произвольные действия в XML-дескрипторе также определяются во вложенном элементе actions, например:

      <pickerField datasource="carDs" property="colour">
          <actions>
              <action id="lookup"/>
              <action id="show" icon="PICKERFIELD_OPEN"
                      invoke="showColour" caption=""/>
          </actions>
      </pickerField>

      Программно задать произвольное действие можно следующим образом:

      @Inject
      protected PickerField colourField;
      
      @Override
      public void init(Map<String, Object> params) {
          colourField.addAction(new AbstractAction("show") {
              @Override
              public void actionPerform(Component component) {
                  showColour(colourField.getValue());
              }
      
              @Override
              public String getCaption() {
                  return "";
              }
      
              @Override
              public String getIcon() {
                  return "icons/show.png";
              }
          });
      }

      Декларативное и программное создание действий подробно описано в разделе Действия. Интерфейс Action.

  • Компонент PickerField можно использовать без непосредственной привязки к данным, то есть без указания datasource и property. В этом случае для указания типа сущности, с которой должен работать PickerField, используется атрибут metaClass. Например:

    <pickerField id="colourField" metaClass="sample$Colour"/>

    Экземпляр выбранной сущности можно получить, инжектировав компонент в контроллер и вызвав его метод getValue().

    Warning

    Для правильной работы компонента PickerField необходима либо установка атрибута metaClass, либо одновременная установка атрибутов datasource и property.

  • В компоненте PickerField можно использовать горячие клавиши: см. Горячие клавиши.