Афоризм
Да, он кобель. Но с длинной родословной.
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Базовый модуль Universal

Базовый модуль base-universal, выполненный по технологии OSGi, существенно облегчает и ускоряет формирование интерфейсного бандла для приложений на платформе JaBricks. Модуль base-universal объединяет в себе свойства двух базовых интерфейсных бандлов base-jdialog и base-jpanel. Таким образом, интерфейсная часть base-universal может быть представлена как диалоговым окном JDialog, так и в виде панели JPanel.

В «чистом виде» модуль base-universal не применяется; он должен быть включен в конфигурацию приложения и использован в качестве родительского. Пример base-universal представлен в templ-universal.

В настоящее время распространяется модуль версии 1.0.1, который полностью совместим с первой версией 1.0.0, и дополнен новым функционалом, отмеченным в тексте.

Основные функциональные свойства модуля base-universal обеспечивают :

  • формирования структуры бандла;
  • представление интерфейса в виде диалогового окна JDialog, либо в виде панели JPanel;
  • возможность интеграции интерфейса другого бандла, созданного также с использованием модуля base-universal;
  • чтение ресурсных файлов бандла;
  • логирование сообщений;
  • подписку на сообщения подключения к серверу БД;
  • подписку на сообщения локализации интерфейса;
  • сохранение и восстановление регулируемых настроек интерфейса;
  • сохранение и восстановление значений интерфейсных компонентов (только версия 1.0.1).

Таким образом, созданный с помощью модуля base-universal бандл имеет возможность формировать интерфейс из нескольких бандлов. Необходимо отметить, что после старта бандла можно только один экземпляр его интерфейсной части одномоментно интегрировать в другой бандл. Чтобы интегрировать бандл в разные модули приложения, к примеру, чтобы иметь возможность в разных частях приложения читать и изменять определенные справочные данные, необходимо чтобы бандл перед стартом находился в состоянии RESOLVED (остановлен) или INSTALLED (инсталлирован), т.е. не должен быть в состоянии ACTIVE.

Особенности старта бандла

Отличительной особенностью старта бандла, созданного с использованием base-universal, является необходимость определения типа представления интерфейса guimode, значением которого может быть либо "jdialog", либо "jpanel". Если модуль, созданный с использованием base-universal, стартует главный фрейм приложения, то параметр guimode необходимо определить либо в структуре описания Панели инструментов, либо в описании Главного меню. То есть, бандл стартует по нажатию на кнопку «Панели инструментов» или при выборе одного из пунктов «Главного меню». Никаких отличий от старта своих «побратимов» ("base-jdialog", "base-jpanel") нет, если не считать необходимость описания guimode, в зависимости от значения которого может быть либо открыто диалоговое окно, либо у главного фрейма будет запрошен контейнер для размещения интерфейсной панели.

Кроме стандартного старта бандла главным фреймом приложения, он может быть также стартован из другого бандла, который назовем родительским. В этом случае в структурах описаний «Панели инструментов» и «Главного меню» никакой информации о стартуемом бандле (назовем его дочерним) не будет. Поэтому дочерний бандл, созданный с использованием base-iniversal, будет запрашивать режим представления интерфейса guimode «по подписке». Родительский бандл должен ответить дочернему бандлу соответствующей «публикацией», чтобы стартованный бандл, мог создать интерфейс, либо реализовать заданные функции. В противном случае, он останется в режиме ожидания ответа (сообщения). Если дочерний бандл должен стартовать в режиме "jpanel", то он запросит для себя «по подписке» контейнер для размещения своего интерфейса. Поскольку дочерний бандл стартует из родительского, то тип представления интерфейса дочернего бандла определяется в родительском модуле, в который он может быть интегрирован.

Таким образом, главной отличительной особенностью бандла на базе base-universal является возможность встраивания интерфейса дочернего бандла в родительский интерфейс. Бандл версии 1.0.1 дополнительно включает возможность сохранения значений компонентов при останове бандла и их восстановление при повторном старте бандла в течение одного сеанса работы приложения.

Структура модуля

На скриншоте слева представлена структура модуля в виде проекта в IDE Eclipse.

В пакете org.jabricks.universal располагаются активатор и классы формирования интерфейса. Активатор UniversalActivator содержит основные методы (start, stop),определенные технологией OSGi-бандла. Остальные классы пакета предназначены для реализации интерфейсной части бандла. Так, если к примеру, бандл будет формировать интерфейс в виде диалогового окна, то активатор будет использовать класс JBDialog, в противном случае будет использован класс JBPanel. Оба класса JBDialog и JBPanel наследуют свойства JBCommon, который содержит общие, доступные наследникам поля и методы (с модификаторами public/protected), необходимые для формирования интерфейса. Чтобы избежать дублирования кода при формировании интерфейса, рекомендуется непосредственно создавать GUI (graphic user interface) в некотором дополнительном классе, которому JBDialog и JBPanel будут передавать свои контейнеры для его размещения. На странице описания модуля templ-universal, использующего base-universal в качестве базового, представлен пример реализации данного подхода.

Модуль версии 1.0.0 дополнительно включает также располагаемый в пакете org.jabricks.universal класс Reference, кооторый рекомендуется использовать в качестве объектов при формировании наборов данных для выпадающих списков JComboBox. В этом случае можно будет реализовать дополнительный функционал данной версии по восстановлению значений компонентов. Более подробно о функционале восстановления значений компонентов представлено здесь.

В пакете org.jabricks.universal.pubsub располагаются классы реализации механизма «публикации/подписки» для организации взаимодействия с другими бандлами. Необходимо отметить, что непосредственно методы создания экземпляров «публикаторов» и «подписчиков», а также методы отправки сообщений располагаются в активаторе UniversalActivator. Кроме этого, активатор содержит методы, которые вызываются подписчиками при получении соответствующих сообщений от «публикаторов». Таким образом, в реализации механизма «публикации/подписки» активатор играет роль «дирижера».

Старт бандла начинается вызовом метода активатора start. Стартовать бандл на базе base-universal могут как главный фрейм приложения из «Главного меню» или «Панели инструментов», так и любой другой бандл. Поэтому после старта могут развиваться разные сценарии создания интерфейса.

В таблице представлено краткое описание классов модуля. Отправка всех сообщений «подписчикам» осуществляется активатором с использованием EventPublisher, имеющего соответстующие методы. 4 класса (GuimodeRequestSubscriber, GuimodeResponseSubscriber, PanelRequestSubscriber, PanelResponseSubscriber) используются для взаимодействия между «родительским» и «дочерним» бандлами. Остальные классы пакета org.jabricks.universal.pubsub участвуют в организации механизма «публикации/подписки» как между бандлами приложения, так и между бандлом и главным фреймом.

МетодыОписание
org.jabricks.universal
UniversalActivator Активатор бандла; содержит методы организации взаимодействия с другими бандлами.
JBDialog Интерфейсный модуль формирования диалогового окна.
JBPanel Интерфейсный модуль формирования панели.
ComponentParams Класс описания регулируемых настроек интерфейса.
Reference Класс описания объекта двумя полями id, name (доступно в версии 1.0.1).
JBCommon Общий класс с методами формирования интерфейса; наследуется классами создания интерфейса JBDialog, JBPanel.
org.jabricks.universal.pubsub
ConnectSubscriber «Подписчик» на сообщение подключения к серверу БД, либо отключения от сервера.
ContainerSubscriber «Подписчик» на сообщение от главного фрейма с контейнером.
EventPublisher Класс отправки сообщений («публикация» сообщений).
LocaleSubscriber «Подписчик» на сообщение изменения текущего языка локализации.
GuimodeRequestSubscriber «Подписчик» на сообщение запроса режима представления интерфейса.
GuimodeResponseSubscriber «Подписчик» на сообщение ответа режима представления интерфейса.
PanelRequestSubscriber «Подписчик» на сообщение запроса панели для создания интерфейса.
PanelResponseSubscriber «Подписчик» на сообщение ответа с панелью для формирование интерфейса.
StartTimeSubscriber «Подписчик» на сообщение времени старта приложения.

Активатор UniversalActivator

В листинге активатора представлены поля и список доступных методов класса. Общие для всех полей модификатор protected «вынесен» в виде комментариев.

Листинг
public class UniversalActivator implements BundleActivator,
                                          IUniversalCommon,
                                         IWidgetsConstants 
{
    // protected

    // связанный с бандлом контекст
    BundleContext           context             = null;
    ServiceTracker<Object, 
                   Object>  logServiceTracker   = null;
    LogService              logService          = null;

    ServiceRegistration<?>  service_starttime   = null;
    ServiceRegistration<?>  service_locale      = null;
    ServiceRegistration<?>  service_connect     = null;
    ServiceRegistration<?>  service_container   = null;

    ServiceRegistration<?>  service_guimode     = null;
    ServiceRegistration<?>  service_pnl_req     = null;
    ServiceRegistration<?>  service_pnl_resp    = null;

    JBPanel                 jpanel              = null;
    JBDialog                jdialog             = null;
    String                  guimode             = null;	

    //-----------------------------------------------------
    public void start(final BundleContext context) 
                                      throws Exception;
    public void stop(final BundleContext context)
                                    throws Exception;
    //-----------------------------------------------------
    public BundleContext getBundleContext();
    //-----------------------------------------------------
    protected void closeForm();
    //-----------------------------------------------------
    protected EventPublisher 
          createEventPublisher(ServiceReference<?> ref);
    //-----------------------------------------------------
    protected void createLocaleSubscriber();
    public    void changeLocale (Locale locale);
    //-----------------------------------------------------
    protected void createConnectSubscriber();
    public    void changeConnect();
    //-----------------------------------------------------
    public void saveComponentParams();
    //-----------------------------------------------------
    protected void 
                createJFrameSubscriber(UniversalActivator);
    protected void sendContainerRequestEvent();
    public    void getJFrameResponseContainer (Container);
    //-----------------------------------------------------
    protected void getGuiMode();
    protected void drawGUI(String guimode);
    protected void createDialogGUI();
    //-----------------------------------------------------
    /* 
     * Методы организации публикации/подписки с главным
     * фреймом для получения времени старта приложения
     */
    protected void sendStartTimeRequestEvent();
    protected void createStartTimeResponseSubscriber
                                      (UniversalActivator);
    public    void getStartTimeResponseMessage(long time);
    public    long getStartTime() 
    //-----------------------------------------------------
    /* 
     * Методы организации публикации/подписки между
     * родительским и дочерним бандлами
     */
    //-----------------------------------------------------
    protected void createGuimodeRequestSubscriber();
    public    void getGuimodeRequestMessage();
    protected void sendGuimodeRequestEvent ();
    //-----------------------------------------------------
    protected void createGuimodeResponseSubcriber();
    public    void getGuimodeResponseMessage(String guimd);
    protected void sendGuimodeResponseEvent (String guimd);
    //-----------------------------------------------------
    protected void createPanelRequestSubscriber();
    public    void getPanelRequestMessage      ();
    protected void sendPanelRequestEvent       ();
    //-----------------------------------------------------
    protected void createPanelResponseSubscriber();
    public    void getPanelResponseContainer(Container);
    protected void 
              sendPanelResponseEvent(Container container);
    //-----------------------------------------------------
}

start
Метод вызывается фреймворком и стартует сервис логирования сообщений.

stop
Метод останавливает все стартованные сервисы и вызывает метод сохранения настроек интерфейса saveComponentParams().

getBundleContext
Метод можно использовать в подписчиках/наследниках для получения связанного с бандлом контекста.

closeForm
Метод закрытия формы; может быть вызван как из диалогового окна при закрытии формы, так и из метода stop при останове бандла.

createEventPublisher
Метод создания отправителя (публикатора) EventPublisher, соодержащего методы отправки сообщений.

createLocaleSubscriber
Метод создания подписчика (LocaleSubscriber) на сообщение изменения текущего языка локализации. При поступлении данного типа сообщения подписчик вызывает метод активатора changeLocale(locale) с новым объектом локализации, который следует в наследнике переопределить.

createConnectionSubscriber
Метод создания подписчика (ConnectSubscriber) на сообщение подключения к серверу БД. При поступлении данного типа сообщения подписчик вызывает метод активатора changeConnect(), который следует в наследнике переопределить.

createJFrameSubscriber
Метод создания подписчика (ContainerSubscriber) на сообщение получения от главного фрейма контейнера для размещения своего интерфейса. Активатор методом sendContainerRequestEvent отправляет главному фрейму сообщение «jabricks/Container/Request». Главный фрейм отвечает сообщением «jabricks/Container/Response». При поступлении данного типа сообщения с контейнером от главного фрейма подписчик вызывает метод активатора getJFrameResponseContainer(), который следует в наследнике переопределить и реализовать функцию создания интерфейса.

getGuiMode
При старте бандла, т.е. из метода активатора start должен быть вызван getGuiMode(), который в структурах описания «Главного меню» и «Панели инструментов» пытается узнать тип представления интерфейса. Если guimode определен, т.е. «jdialog» или «jpanel», то getGuiMode() передаст управление методу drawGUI(guimode), в противном случае будет вызван метод sendGuimodeRequestEvent() для отправки родительскому бандлу запроса о режиме guimode. В этот момент бандл переходит в состояние STARTED и ждет ответа от родительского бандла; интерфейс не создан.

drawGUI
Метод создания интерфейса бандла. В зависимости от значения guimode будет либо вызван метод createDialogGUI для создания диалогового окна с использованием класса JBDialog, либо будет запрошен контейнер у главного фрейма для панели JPanel методом sendContainerRequestEvent.

createDialogGUI
Метод создания диалогового окна с использованием класса JBDialog; вызывается из метода drawGUI при guimode='jdialog'.

Методы получения времени старта приложения
Для чего бандлу может понадобиться время старта приложения? Только для восстановления измененных значений в интерфейсной панели бандла в течение одного сеанса функционирования приложения. Рассмотрим пример, в котором бандл создает свой интерфейс в виде панели, т.е. с guimode='jpanel'. Панель бандла размещается либо в контейнере главного фрейма, либо в контейнере другого бандла. Допустим пользователь внес какие-либо изменения в компоненты формы, и после этого открыл другую вкладку главного фрейма. Через некоторое время, пользователь возвращается на первоначально открытую вкладку. Если ранее введенные значения не восстановить, то останется неприятный осадок от недоработанного программного продукта. Поэтому необходимо сравнить время сохранения измененных значений формы и время старта приложения. Если время старта приложения отстает от времени сохранения, то, следовательно, сохраненные значения относятся к предыдущему сеансу, и восстанавливать их нет необходимости. В противном случае необходимо заполнить форму сохраненными значениями.

Методом createStartTimeResponseSubscriber(UniversalActivator) создается подписчик на запрос времени старта приложения, после чего можно отправлять запрос главному фрейму методом sendStartTimeRequestEvent. При поступлении от главного фрейма ответа подписчик вызовет метод getStartTimeResponseMessage(long), которому в качестве параметра передаст время старта приложения в мс. Метод активатора getStartTime() позволяет получить время старта программы в классах формирования интерфейса.

createGuimodeRequestSubscriber
Метод создания подписчика (GuimodeRequestSubscriber) на сообщение получения от дочернего бандла режима представления интерфейса. Подписчика создает родительский бандл перед стартом дочернего. Дочерний бандл, созданный с использованием base-iniversal, при старте пытается определить в структурах описания «Главного меню» и «Панели инструментов» режим представления интерфейса guimode. Если режим неопределен, то бандл отправляет родительскому бандлу сообщение «jabricks/GuiMode/Request» методом активатора sendGuimodeRequestEvent(). При поступлении данного типа сообщения подписчик родительского бандла вызывает метод активатора getGuimodeRequestMessage(), который следует в наследнике переопределить с целью отправки ответа «jabricks/GuiMode/Response» дочернему бандлу методом sendGuimodeResponseEvent со значением guimode. В методе getGuimodeRequestMessage выполняется отключение (разрегистрация) от подписки на сообщение «jabricks/GuiMode/Request». Поэтому в переопределенном методе наследника следует вызвать родительский, как это представлено в следующем листинге getGuimodeRequestMessage, который реализован в примере templ-universal.

Листинг
// Метод активатора родительского бандла

@Override
public void getGuimodeRequestMessage()
{
    super.getGuimodeRequestMessage();
    /*
     * Метод getGuimode() определяет значение guimode
     * для стартуемого (дочернего) бандла
     */
    String guimode = getGuimode();
    if (guimode.equalsIgnoreCase(GUIMode_jpanel))
        // Создание подписчика для запроса панели
         createPanelRequestSubscriber();
	 
    sendGuimodeResponseEvent (guimode);
}

createGuimodeResponseSubcriber
Метод создания подписчика (GuimodeResponseSubcriber) на сообщение получения от родительского бандла режима представления интерфейса. Подписчика создает дочерний бандл перед отправкой родительскому сообщения «jabricks/GuiMode/Request» методом sendGuimodeRequestEvent, в котором перед отправкой создается подписчик GuimodeResponseSubcriber вызовом метода createGuimodeResponseSubcriber(). При поступлении от родительского бандла ответа с guimode в виде сообщения «jabricks/GuiMode/Response» подписчик вызывает метод активатора getGuimodeResponseMessage(guimode), который следует в наследнике переопределить для принятия решения. Если, режим представления "jdialog", то интерфейс необходимо создать в виде диалогового окна, в противном случае в виде панели, для которой следует запросить контейнер у родительского бандла. Ниже представлен листинг переопределенного метода getGuimodeResponseMessage (String), который реализован в примере templ-universal. Сначала в методе вызывается одноименный метод родительского класса для отключения (разрегистрации) от подписки на сообщение «jabricks/GuiMode/Response». После этого анализируется значение guimode, и, при необходимости, выполняется запрос контейнера (панели) родительского модуля.

Листинг
// Метод активатора дочернего бандла

@Override
public void getGuimodeResponseMessage(final String guimode)
{
    super.getGuimodeResponseMessage(null);

    if (guimode.equalsIgnoreCase(GUIMode_jdialog))
        createDialogGUI();
    else
        // Отправка сообщения с запросом панели
        sendPanelRequestEvent();
}

createPanelRequestSubscriber
Метод создания подписчика (PanelRequestSubscriber) на сообщение «jabricks/Panel/Request» от дочернего бандла с запросом контейнера. Подписчик должен быть создан родительским бандлом до отправки дочернему бандла сообщения «jabricks/GuiMode/Response» с режимом представления интерфейса guimode = 'jpanel', (см. пример выше). При получении от дочернего бандла сообщения с запросом контейнера подписчик вызовет метод активатора getPanelRequestMessage, который следует переопределить в наследнике. В следующем листинге представлен переопределенный метод примера templ-universal. В методе сначала вызывается одноименный метод суперкласса для отключения (разрегистрации) от подписки на сообщение «jabricks/Panel/Request». После этого методом getContainer определяется контейнер, который отправляется дочернему бандлу в сообщении «jabricks/Panel/Response» методом sendPanelResponseEvent. Метод getContainer определяет контейнер интерфейса, созданного либо классом JBDialog, либо классом JBPanel.

Листинг
// Метод активатора родительского бандла

@Override
public void getPanelRequestMessage()
{
    super.getPanelRequestMessage();

    Container container = getContainer();

    if (container != null)
        sendPanelResponseEvent(container);
}
 

createPanelResponseSubscriber
Метод создания подписчика (PanelResponseSubscriber) на сообщение с контейнером («jabricks/Panel/Response») от родительского бандла. Подписчик должен быть создан дочерним бандлом до отправки родительскому бандлу запроса контейнера «jabricks/Panel/Request» методом sendPanelRequestEvent() (см. пример выше getGuimodeResponseMessage). В следующем листинге представлен переопределенный метод getPanelResponseContainer (Container) примера templ-universal. В методе сначала вызывается одноименный метод суперкласса для отключения (разрегистрации) от подписки на сообщение «jabricks/Panel/Response». После этого создается размещаемая в родительском контейнере интерфейсная панель JPanelForm, наследующая свойства JBPanel.

Листинг
// Метод активатора дочернего бандла

@Override
public void getPanelResponseContainer(Container container)
{
    super.getPanelResponseContainer(null);
    if (container != null) {
        jpanel = new JPanelForm(this);
        ((JPanelForm)jpanel).createGUI(container);
    }
}
 

Пимечание :
Все методы активатора, связанные с организацией механизма публикации/подписки, можно разделить на две группы, относящиеся соответственно к родительским и дочерним бандлам :

1. Методы дочернего бандла :
• createGuimodeResponseSubcriber
• getGuimodeResponseMessage
• sendGuimodeRequestEvent
• createPanelResponseSubscriber
• sendPanelRequestEvent
• getPanelResponseMessage

Дочерние методы создают подписчиков createXXXResponseSubcriber, отправляют запрос sendXXXRequestEvent и получают ответ в методе активатора getXXXResponseMessage.

2. Методы родительского бандла :
• createGuimodeRequestSubscriber
• getGuimodeRequestMessage
• sendGuimodeResponseEvent
• createPanelRequestSubscriber
• getPanelRequestMessage
• sendPanelResponseEvent

Родительские методы создают подписчиков createXXXRequestSubscriber, получают запрос в методе активатора getXXXRequestMessage, и отправляют ответ sendXXXResponseEvent.

3. Условные обозначения
XXX имеет обозначение Guimode и Panel.

Реализация механизма «публикации/подписки» между родительским и дочерним бандлами на сообщения отправки и получения «Режима представления интерфейса» (guimode) и контейнера родительского бандла с использованием бандла base-universal представлена в примере templ-universal и в описании Урока 14.

Класс JBDialog

Класс JBDialog наследует свойства класса JBCommon и включает переменную jdialog, определяющую диалоговое окно. Конструктор класса получает в качестве параметра контекст бандла, определяет текущий язык локализации (locale) и создает диалоговое окно. Метод formCentering определяет размер окна и выполняет его центрирование на экране монитора. Методы getWidth() и getHeight() переопределяют абстрактные методы суперкласса; данные методы используются для сохранения регулируемых настроек интерфейса (размера диалогового окна).

Листинг
public class JBDialog extends JBCommon
{
    protected  JDialog  jdialog = null;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public JBDialog (final BundleContext context)
    {
        this.context = context;

        IResources resources = new ResourcesImpl();
        this.locale  = resources.getLocale();

        jdialog = new JDialog();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	/**
	 * Процедура центрирования окна
	 * @param width размер окна по горизонтали
	 * @param height размер окна по вертикали 
	 */
    protected void formCentering(final int width, 
                                 final int height)
    {
        // Получение размера экрана
        Dimension screenSize = Toolkit.getDefaultToolkit()
                                      .getScreenSize();
        int x = (screenSize.width  - width ) / 2;
        int y = (screenSize.height - height) / 2;
        jdialog.setBounds(x, y, width, height);
	}
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    @Override
    protected int getWidth()
    {
        return jdialog.getWidth();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    @Override
    protected int getHeight()
    {
        return jdialog.getHeight();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public JDialog getJDialog()
    {
        return this.jdialog;
    }
}
 

Класс JBPanel

Класс JBPanel наследует свойства класса JBCommon. Конструктор класса в качестве параметра получает контекст бандла и определяет текущий язык локализации (locale).

Процедура createPanel в качестве параметра получает контейнер и методом суперкласса createDesk создает неразделяемую панель pnlDesk типа JPanel, которую размещает в контейнере. Супер класс JBCommon имеет метод createSplitDesk(int divider_pos) для создания компонента splitDesk типа JSplitPane с горизонтальным размещением сепаратора (JSplitPane.HORIZONTAL_SPLIT) в позиции divider_pos. При необходимости Вы можете переопределить метод createPanel, чтобы использовать в качестве подложки интерфейса вместо неразделяемой панели pnlDesk разделенную на две части по горизонтали панель splitDesk, либо создать что-то своё.

Методы getWidth() и getHeight() переопределяют абстрактные методы суперкласса; данные методы могут быть использованы для сохранения регулируемых настроек интерфейса.

Листинг
public class JBPanel extends JBCommon
{
    public JBPanel (BundleContext context)
    {
        this.context= context;

        IResources resources = new ResourcesImpl();
        this.locale  = resources.getLocale();
	}
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /**
     * Метод создания интерфейса рабочей области панели
     * @param container контейнер
     */
    protected void createPanel(Container container)
    {
        // Создание интерфейсной панели
        this.createDesk();
        pnlDesk.setLayout(new BorderLayout());
        // Размещение панели в контейнере
        container.add(pnlDesk);
        container.doLayout();
        pnlDesk.doLayout();
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    public JPanel getJPanel()
    {
        return this.pnlDesk;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    @Override
    protected int getWidth()
    {
        if (pnlDesk != null)
            return pnlDesk.getWidth();
        else if (splitDesk != null)
            return splitDesk.getWidth();
        else
            return 0;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    @Override
    protected int getHeight()
    {
        if (pnlDesk != null)
            return pnlDesk.getHeight();
        else if (splitDesk != null)
            return splitDesk.getHeight();
        else
            return 0;
    }
}
 

Класс JBCommon

В таблице представлены поля (переменные) и методы класса JBCommon, свойства которого наследуют интерфейсные классы JBDialog и JBPanel.

Абстрактный класс JBCommon включает два абстрактных метода, которые используются при сохранении регулируемых настроек диалогового окна.

Группа методов, связанная с сохранениями регулируемых настроек интерфейса (размер окна, положение сепаратора, размеры колонок таблиц), может быть также использована для сохранения и восстановления измененных значений в визуальных компонентах формы. Для этого следует переопределить методы writeDocument(document, path) и readDocument (fname).

Версия модуля 1.0.1 дополнена методами обработки XML-документов, связанных с чтением файла с сохраняемыми регулируемыми настройками интерфейса; в содержимое файла (документа) можно включить дополнительную информацию.

Модификатор Объект Описание
Поля класса
protectedBundleContext context Контекст бандла.
protectedLocale locale Текущий объект локализации.
protectedJPanel pnlButtons Панель кнопок управления.
protectedJPanel pnlDesk Неразделяемая панель интерфейса.
protectedJSplitPane splitDesk Разделяемая на две части панель интерфейса.
protectedint HGAP = 5 Интервал между кнопками управления.
protectedint BUTTON_width = 90 Размер кнопки управления по ширине.
protectedint BUTTON_height = 24 Размер кнопки управления по высоте.
protectedDimension form_dim Размер диалогового окна (интерфейс типа JDialog).
protectedList<ComponentParams> cparams Массив описаний регулируемых настроек интерфейса.
Методы класса
protectedint getWidth () Абстрактный метод получения размера формы по ширине; используется при сохранении регулируемых настроек диалогового окна.
protectedint getHeight () Абстрактный метод получения размера формы по высоте; используется при сохранении регулируемых настроек диалогового окна.
protectedvoid createDesk() Метод создания неразделяемой панели pnlDesk типа JPanel.
protectedvoid createSplitDesk(int divider_pos) Метод создания разделяемой на две части панели splitDesk типа JSplitPane.
protectedImageIcon getImage(String) Метод получения изображения из ресурсных файлов бандла.
protectedProperties loadProperties(rsc, locale) Метод чтения локальных ресурсных свойств бандла; rsc – путь к ресурсному файлу, locale – текущий объект локализации.
protectedJPanel createButtonsPanel() Метод создания панели pnlButtons для размещения кнопок управления; макет размещения кнопок при добавлении слева-направо.
publicvoid changeLocale(locale) Метод изменения локализованных надписей интерфейса при смене языка локализации
publicboolean dialogConfirm(Component parent,
final String title,
final String text,
final String yes,
final String no)
Метод открытия диалогового окна типа JOptionPane.showConfirmDialog для подтверждения.
publicboolean dialogMessage(Component parent,
final int icon,
final String title,
final String text)
Метод открытия диалогового окна типа JOptionPane.showMessageDialog
protectedDate getSaveDateTime() Метод получения времени сохранения регулируемых настроек интерфейса; вместе с регулируемыми настройками можно сохранять и измененные значения компонентов формы для их восстановления при следующем старте бандла.
Методы обработки регулируемых настроек
protectedString createFileName() Метод определения наименования файла для сохранения регулируемых настроек интерфейса в поддиректории gui. Наименование файла определяется в формате «gui/[SymbolicName]-[Version].xml».
publicvoid saveComponentParams() Метод сохранения регулируемых настроек интерфейса.
protectedvoid readComponentParams() Метод чтения регулируемых настроек интерфейса в переменную cparams; для диалогового окна метод определяет значение form_dim.
protectedvoid writeDocument(document, path) Метод сохранения регулируемых настроек в формате XML в файл path. Данный метод можно переопределить и добавить к объекту document измененные значения компонентов для сохранения.
protectedDocument readDocument (fname) Метод чтения XML файла. Данный метод можно использовать для чтения вместе с регулируемыми настройками сохраненных значений компонентов.
protectedComponentParams extractComponentParams
(className, name)
Метод чтения описания регулируемой настройки компонента типа className, имеющего наименование name.
Дополнительные методы версии 1.0.1
protectedDocument readSavedGuiDocument() Метод чтения сохраненного документа с регулируемыми настройками интерфейса.
protected
String getNodeValue (document, node_name)
Метод чтения значения тега 'node_name' документа 'document' на первом уровне, т.е. дочернего элемента корневого узла.
protected
Node getNodeValue (document, node_name)
Метод чтения узла 'node_name' документа 'document' на первом уровне, т.е. дочернего элемента корневого узла.
protected
NamedNodeMap getAttributes (document, node_name)
Метод чтения атрибутов 'node_name' документа 'document' на первом уровне, т.е. дочернего элемента корневого узла.

Класс ComponentParams

ComponentParams используется для описания изменяемых параметров (размер, положение) объектов типа JSplitPane, JTable. В листинге класса методы get/set не представлены.

Листинг
public class ComponentParams
{
    private  String  clazz   ;
    private  String  name    ;
    private  int     location;
    private  String  columns ;
    private  String  value   ;
    private  String  checked ;  
    private  int     selected;
    private  int     tab     ;  

    public ComponentParams() {}

    public ComponentParams(String clazz, String name) {
        this.clazz = clazz;
        this.name = name;
    }

    // Методы get/set
    ...
}

Класс Reference

Reference следует использовать в качестве объекта при формировании набора данных для компонентов типа JComboBox. В листинге класса методы get/set не представлены.

Листинг
public class Reference
{
    private  int     id      ;  
    private  String  name    ;

    public Класс Reference() {}

    public Reference(int id, String name) 
    {
        this.id = id;
        this.name = name;
    }

    // Методы get/set
    ...
}

Зависимости

Базовый модуль base-universal функционирует вместе со следующими бандлами приложения JaBricks :

gui-widgets используются константы и компоненты при формировании интерфейса формы
util-resources используется для получения внешних ресурсов

Кроме данных бандлов платформы JaBricks модуль base-universal имеет следующие зависимости, загружаемые фреймворком при старте приложения :

  • org.osgi.framework – Felix-фреймворк;
  • org.osgi.service.event.*,org.osgi.util.tracker.* – сервисы фреймворка публикации/подписки;
  • org.w3c.dom.*, javax.xml.parsers – классы обработки XML-документов;
  • javax.swing.* – классы библиотеки Swing.

Подключение модуля base-universal

Для подключения модуля base-universal в приложение JaBricks необходимо :

  • разместить модуль в поддиректории «configuration/bundles/»;
  • внести в файл инициализации бандлов «bundles.ini» запись : base-universal-1.0.1.jar;

GAV параметры модуля base-universal имеют следующие значения :

• groupId : org.jabricks.universal
• artifactId : base-universal
• version : 1.0.1

Подробнее о включении модуля в приложение Jabricks представлено здесь.

Скачать base-universal

Рассмотренный на странице базовый модуль разработки интерфейса base-universal версии 1.0.0 упакован в архивный файл base-universal-1.0.0.zip (32.0 Кб); версия 1.0.1 упакована в архивный файл base-universal-1.0.1.zip (31.7 Кб).

  Рейтинг@Mail.ru