Реализация компонента виджет

Чтобы создать новый компонент Виджет с нуля, вам необходимо создать несколько классов Java.

Класс компонента

У класса компонента Виджет нет логики, он содержит свойства компонентов и их геттеры (getters) и сеттеры (setters). Этот класс унаследован от WAbstractComponent, который определяет некоторые свойства (ключ, описание, высота, ширина и другие). Эти поля являются общими, подходят для большинства типов компонентов. Класс компонентов позволяет определить дополнительные свойства компонентов и их геттеров и сеттеров.

Пожалуйста, обратите внимание, что любой сеттер в преемнике класса WAbstractComponent должен создавать событие с информацией об изменениях.

Пример: Сеттер для значения свойства:

  public void setValue(int value)

  {

    int oldValue = this.value;

    this.value = value;

    firePropertyChange("value", oldValue, value);

  }

Эти события необходимы для обработки изменений значений в видимых частях компонента.

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

Пример: метод clone() для WNewComponent, который унаследован у WAbstractComponent:

  public WNewComponent clone()

  {

    return (WNewComponent) super.clone();

  }

Не забудьте реализовать метод getComponentGroup(). Он определяет группу компонентов для нового компонента. Предлагается пользовательская группа, но вы можете выбрать любую другую.

Пример: реализация для getComponentGroup() по умолчанию; подходит практически всегда:

  public ComponentGroup getComponentGroup()

  {

    return ComponentGroup.CUSTOM;

  }

Класс контекстов

Оболочка контекста для компонента Виджет. Этот класс должен быть унаследован от WAbstractContext. Он предоставляет возможность работать с компонентом Виджет как с контекстом. Например, для того, чтобы представить свойства компонентов в редакторе свойств. Реализация этого класса главным образом относится к определению переменных. Перепишите метод createVariableDefinitions(), чтобы добавить описание переменной в этот контекст.

Пример: реализация для createVariableDefinitions():

  protected void createVariableDefinitions()

  {

    super.createVariableDefinitions();

    addDefaultVariableDefinition(VD_VALUE);

  }

Используйте addDefaultVariableDefinition(VariableDefinition vd) только для свойств компонента по умолчанию. Для других свойств используйте addVariableDefinition(VariableDefinition vd).

Класс отрисовщика

 

Класс отрисовщика используется для представления компонента Виджет в стиле Swing. Он унаследован от DefaultSwingComponentRenderer, который определяет общее поведение и функциональность для разных реализаций визуализации. Например, у него есть поле Компонент, которое будет использоваться в каждом отрисовщике элемента.

Класс отрисовщика должен реализовывать метод createRenderer(). Вы можете создать компонент Swing, настроить его и добавить слушателей, чтобы управлять событиями. Если некоторые изменения свойств требуют выполнения дополнительных действий, вы можете переписать метод componentPropertyChanged(String property).

Пример: создание отрисовщика для индикатора выполнения:

  public JProgressBar createRender()

  {

    final JProgressBar progressBar = new JProgressBar();

    progressBar.setValue(getComponent().getValue());

    

    if (getRendererSupport().isInteractive())

    {

      progressBar.addChangeListener(new ChangeListener()

      {

        @Override

        public void stateChanged(ChangeEvent e)

        {

          getComponent().setValue(progressBar.getValue());

        }

      });

    }

    

    return progressBar;

  }

Пример: использование метода componentPropertyChanged(String property) для выполнения дополнительных действий после изменения свойств:

  public void componentPropertyChanged(String property)

  {

    super.componentPropertyChanged(property);

    

    if (property.equals("value"))

    {

      progressBar.setForeground(getColor());

      getRendererSupport().renderChanged();

    }

  }

Класс поддержки отрисовщика

Класс поддержки отрисовщика является опциональным. Он унаследован от DefaultEditorComponentRendererSupport. Его реализация может пригодиться, если вам нужно заставить отрисовщик представить изменения свойств в релевантном элементе в редакторе виджетов. В большинстве случаев в этом нет необходимости, потому что DefaultEditorComponentRendererSupport реализует автоматическое выполнение соответствующих геттеров в элементе и сеттеров в объекте представления. Если автоматическая реакция не подходит для некоторых свойств, вы можете переписать метод componentPropertyChanged(String property) и реализовать собственного обработчика.

Главный класс плагинов

Главный класс плагинов предоставляет доступ к классам компонента. Он должен быть унаследован от ComponentPlugin. Необходимо переписать как минимум несколько методов, чтобы предоставить функциональность компонентов.

  • getWComponent() должен возвращать класс компонентов
  • getSwingRenderer() должен возвращать класс отрисовщика
  • getEditorRendererSupport() должен опционально возвращать класс поддержки отрисовщика. Переписывание этого метода важно лишь в случае реализации класса поддержки отрисовщика.
  • getId() должен возвращать ID компонента опционально. Реализация по умолчанию использует ID плагина из дескриптора, чтобы сгенерировать ID компонента.
  • Методы doStart() и doStop() должны быть переписаны на ваше усмотрение.

Иконка компонента

Для представления новому компоненту Виджет нужна иконка. Редактор виджетов SberMobile использует изображения формата PNG одного размера (20x20) как иконки компонентов. Таким образом, вы можете добавить изображение в файл компонента JAR и использовать с помощью конструктора WAbstractComponent. Обратите внимание, что параметр iconId должен быть таким, как и имя файла иконки без расширений.

Модификация дескриптора плагина

Чтобы создать дескриптор плагина для вашего пользовательского компонента, измените следующее в демо-файле компонента plugin.xml:

  • Измените последнее слово в атрибуте id тэга <plugin> на ID нового плагина. ID должен содержать только строчные буквы, цифры и нижнее подчеркивание. Например, если требуемый ID вашего плагина xyz, установите атрибут ID на com.tibbo.aggregate.common.plugin.component.xyz
  • Измените атрибут class тэга <plugin> на полное имя главного класса плагина
  • Внесите описание компонента в тело тэга <doc-text>
  • Измените атрибут id тэга <extension> на новый ID плагина

Создание и внедрение архива плагинов

Измените следующее в файле Ant build.xml:

  • Измените имя проекта и имя файла назначения (файл плагина JAR)
  • Запустите build.xml, используя Ant, чтобы создать файл плагина JAR
  • Скопируйте файл JAR в %SberMobile Server Installation Folder/plugins/component, когда SberMobile Server не запущен
  • Скопируйте файл JAR в %SberMobile IIoT Platform Client Installation Folder/plugins/component, когда SberMobile IIoT Platform Client не запущен
  • Запустите SberMobile Server и SberMobile IIoT Platform Client
  • Создайте новый вмджет и измените его в редакторе виджетов
  • Найдите новый компонент во вкладке тулбара Пользовательские компоненты