Афоризм
В стогу не ищут нравственных устоев.
Последние статьи

 • Активности 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

Пример панели templ-jpanel

Проект templ-jpanel, наследующий свойства базового модуля base-jpanel, можно использовать в качестве шаблона при разработке интерфейсных модулей для приложений на платформе JaBricks. В проекте реализованы механизмы «подписки» на сообщения локализации интерфейса и подключения к серверу БД, а также протоколирования сообщений.

Описание проекта

Шаблон проекта, структура которого представлена на следующем скриншоте, выполнен в IDE Eclipse с использованием фреймворка Maven и включает :

JPanelActivator.java активатор бандла,
JPanelForm.java интерфейсную панель,
pom.xml проектный файл.

Активатор JPanelActivator и класс формы JPanelForm наследуют свойства базовых классов создания интерфейсного бандла. Описание проекта в pom.xml содержит параметры GAV (groupId, artifactId, version), секцию зависимостей <dependencies> и секцию сборки <build>, в которую включена декларацию плагина BND для формирования OSGi бандла.

Данный шаблон проекта создания бандла с интерфейсом JPanel позволяет существенно ускорить и облегчить разработку новых OSGi бандлов.

Преимущества использования данного проектного шаблона :
1. Подключение к сервису логирования и отключение от сервиса логирования реализованы в родительском активаторе. Для отправки сообщений бандлу логирования (util-logger) достаточно вызвать соответствующий метод родительского класса с передачей ему значений уровня логирования и текста.
2. Для получения в режиме run-time сообщений о подключении к серверу БД и отключении от сервера БД достаточно вызвать соответствующие методы родительского активатора.
3. Реализован механизм сохранения и восстановления регулируемых настроек интерфейса.

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

Активатор JPanelActivator наследует свойства активатора JBPanelActivator базового модуля base-jpanel. Класс активатора декларируется в соответствующей секции описания плагина BND (maven-bundle-plugin) проектного файла pom.xml.

В классе активатора переопределены методы start, getJFrameResponseContainer и saveComponentParams. Метод start вызывается OSGi-фреймворком при старте модуля. В данном методе выполняется подписка на сообщения локализации, сохранения регулируемых настроек интерфейса и получения контейнера главного фрейма. После этого главному фрейму отправляется сообщение («публикация» сообщения с запросом контейнера) вызовом родительского метода sendContainerRequestEvent, которому в качестве параметра передается наименование класса интерфейсной панели бандла (JPanelForm.class.getName). При получении от главного фрейма ответа «по подписке» в виде сообщения с контейнером вызывается метод активатора getJFrameResponseContainer(Container) для создания интерфейсной панели JPanelForm.

При останове бандла вызывается метод активатора saveComponentParams для сохранения регулируемых интерфейсных настроек (положения разделителей JSplitPane, размеров колонок таблицы JTable). Наряду с регулируемыми настройками Вы можете «организовать» сохранение значений компонентов типа JTextField, JTextArea и т.д, чтобы при очередном старте бандла восстановить интерфейс с измененными/введенными значениями в полях формы.

Листинг
package org.jabricks.templates;

import java.util.Locale;
import java.awt.Container;

import org.osgi.framework.BundleContext;

import org.jabricks.resources.IResources;
import org.jabricks.resources.ResourcesImpl;

import org.jabricks.jpanel.JBPanelActivator;

public class JPanelActivator extends JBPanelActivator 
{
    //-----------------------------------------------------
    /**
     * Процедура старта, вызывается фреймворком
     * @param context   
     */
    @Override
    public void start(final BundleContext context) 
                                     throws Exception {
        super.start(context);

        // Подключение слушателей ("подписка")
        createLocaleSubscriber();
        createJFrameSubscriber(this);
 
        // Запрос контейнера ("публикация")
        String cls_name = JPanelForm.class.getName();
        sendContainerRequestEvent(cls_name);
    }
    //-----------------------------------------------------
    @Override
    public void getJFrameResponseContainer(Container 
                                               container) {
        IResources resources = new ResourcesImpl();
        jpanel= new JPanelForm(this, resources.getLocale());
        ((JPanelForm)jpanel).createGUI(container);
    }
    //-----------------------------------------------------
    @Override
    public void saveComponentParams() 
    {
        if (jpanel != null)
            jpanel.saveComponentParams();
    }
}

Класс формирования интерфейса JPanelForm

На следующем скриншоте представлен интерфейс окна примера второго урока. Центральное место в интерфейсе занимает панель, созданная классом JPanelForm. Интерфейс панели включает 3 области, разделенные между собой двумя сепараторами типа JSplitPane. Расцветка панелей соответствует версии бандла '1.0.0', используемому в нескольких обучающих уроках. В четвертом уроке рассматривается вопрос использования в приложении JaBricks «разноверсионных» бандлов, где данный бандл используется в двух разных версиях ('1.0.0', '2.0.0'); отличительная расцветка панелей в разноверсионных бандлах позволяет определить стартованный модуль.

Класс JPanelForm наследует свойства базового интерфейсного класса JBPanel. Конструктор класса в качестве параметров получает активатор бандла и текущую Locale. В зависимости от установленного в приложении языка локализации могут быть загружены соответствующие ресурсы resources, которые следует использовать для формирования интерфейса. В данном классе/примере ресурсные файлы не используются. Кроме этого, в конструкторе класса вызывается метод readComponentParams(), который «читает» ранее сохраненные последние настройки регулируемых параметров интерфейса в cparams.

Интерфейс панели создается трёмя методами. Активатор модуля, получив от главного фрейма сообщение с контейнером, вызывает метод createGUI(Container), в котором сначала вызывается одноименный метод родительского/базового класса для «размещения» панели в контейнере фрейма. Мы знаем, что базовый класс JBPanel наследует свойства JPanel, а следовательно и наш класс JPanelForm также будет имет свойства панели. После этого определяются внутренние границы панели и создаются два компонента split_h и split_v типа JSplitPane, размещаемые в панели. Для создания интерфейсных компонентов split_h и split_v вызываются соответственно методы createSplitPaneHorizontal() и createSplitPaneVertical(), в которых восстанавливаются последние регулируемые настройки сплитеров.

Как было отмечено выше, конструктор класса считывает последние сохраненные регулируемые настройки интерфейса в переменную cparams. Метод базового класса extractComponentParams с параметрами class.SimpleName и component.Name позволяет получить регулируемую настройку компонента в виде экземпляра класса ComponentParams. После этого не составляет труда определить её новое интерфейсное положение (разделитель), либо размер (колонка в таблице).

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

Листинг
package org.jabricks.templates;

import java.awt.*;

import javax.swing.*;
import javax.swing.border.Border;

import org.jabricks.jpanel.JBPanel;
import org.jabricks.jpanel.ComponentParams;
import org.jabricks.jpanel.JSplitPaneChangeListener;

import java.util.Locale;

public class JPanelForm extends JBPanel
{
    private static final long  serialVersionUID = 1L;

    private    JSplitPane   split_h;
    private    JSplitPane   split_v;

    private  final  int     DIVIDER_H   = 450;
    private  final  int     DIVIDER_V   = 200;

    private  final  String  SPLITPANE_H = "SPLITPANE_H";
    private  final  String  SPLITPANE_V = "SPLITPANE_V";
    //-----------------------------------------------------
    public JPanelForm(final JPanelActivator activator, 
                      final Locale locale)
    {
        super(activator, locale);
        readComponentParams();
    }
    //-----------------------------------------------------
    private void createSplitPaneVertical()
    {
        split_v = new JSplitPane();
        split_v.setName(SPLITPANE_V);

        split_v.setOneTouchExpandable(false);
        split_v.setOrientation(JSplitPane.VERTICAL_SPLIT);		

        if (cparams.size() == 0)
            split_v.setDividerLocation(DIVIDER_V);
        else {
            ComponentParams cp;
            String          cls;
            cls = JSplitPane.class.getSimpleName();
            cp = extractComponentParams(cls, SPLITPANE_V);
            if (cp != null)
                split_v.setDividerLocation(cp.getLocation());
            else
                split_v.setDividerLocation(DIVIDER_V);
        }
        // Create a regular old label
        JPanel pnlTop    = new JPanel();
        JPanel pnlBottom = new JPanel();

        String version = activator.getBundleContext()
                                  .getBundle()
                                  .getVersion()
                                  .toString();
        if (version.equalsIgnoreCase("1.0.0")) {
            // 1.0.0
            pnlTop .setBackground(Color.blue );
            pnlBottom.setBackground(Color.green);
        } else {
            // 2.0.0
            pnlTop .setBackground(Color.red   );
            pnlBottom.setBackground(Color.yellow);
        }
        split_v.setTopComponent   (pnlTop   );
        split_v.setBottomComponent(pnlBottom);		

        JSplitPaneChangeListener listener;
        listener = new JSplitPaneChangeListener(this);
        split_v.addPropertyChangeListener(listener);
    }
    //-----------------------------------------------------
    private void createSplitPaneHorizontal()
    {
        split_h = new JSplitPane();
        split_h.setName(SPLITPANE_H);
        
        // JSplitPane.HORIZONTAL_SPLIT, 
        split_h.setOneTouchExpandable(false);
        split_h.setOrientation(JSplitPane.HORIZONTAL_SPLIT);

        if (cparams.size() == 0)
            split_h.setDividerLocation(DIVIDER_H);
        else {
            ComponentParams cp;
            String          cls;
            cls = JSplitPane.class.getSimpleName();
            cp = extractComponentParams(cls, SPLITPANE_H);
            if (cp != null)
                split_h.setDividerLocation(cp.getLocation());
            else
                split_h.setDividerLocation(DIVIDER_H);
        }
        JPanel pnlLeft  = new JPanel();
        JPanel pnlRight = new JPanel();

        pnlRight.setLayout(new BorderLayout());

        String version = activator.getBundleContext()
                                  .getBundle()
                                  .getVersion()
                                  .toString();
        if (version.equalsIgnoreCase("1.0.0")) {
            // 1.0.0
            pnlLeft .setBackground(Color.blue );
            pnlRight.setBackground(Color.green);
        } else {
            // 2.0.0
            pnlLeft .setBackground(Color.red   );
            pnlRight.setBackground(Color.yellow);
        }
        split_h.setLeftComponent (pnlLeft );
        split_h.setRightComponent(pnlRight);

        JSplitPaneChangeListener listener;
        listener = new JSplitPaneChangeListener(this);
        split_h.addPropertyChangeListener(listener);
    }
    //-----------------------------------------------------
    /**
     * Метод создания интерфейса рабочей области панели
     * @param container контейнер фрейма : 
     *                             JFrame.getContentPane()
     */
    public void createGUI(Container container)
    {
        super.createGUI(container);

        setVisible(false);
        Border border;
        border = BorderFactory.createEmptyBorder(2,2,2,2);  
        setBorder (border);

        createSplitPaneHorizontal();
        createSplitPaneVertical  ();

        this.add(split_h, BorderLayout.CENTER);

        ((JPanel)split_h.getRightComponent())
                        .add(split_v, BorderLayout.CENTER);
        this.setVisible(true);
    }
}

Листинг проектного файла, pom.xml

В начале описания проекта в файле pom.xml определяются GAV параметры бандла. Далее текст описания включает несколько секций :

  • properties — секция определения кодировки, флага игнорирования выполнения тестов и версии компилятора;
  • dependencies — секция определения используемых в проекте зависимостей :
    • org.apache.felix.framework — фреймворк;
    • org.apache.felix.eventadmin — обработчик событий;
    • util-resources — модуль ресурсов;
    • gui-widgets — модуль компонентов формирования интерфейса;
    • base-jpanel — модуль базовых классов.
  • build — секция определения компилятора и плагина BND.
Листинг
<project
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                        http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.jabricks.templates</groupId>
  <artifactId>templ-jpanel</artifactId>
  <packaging>bundle</packaging>
  <version>1.0.0</version>

  <name>JPanel template</name>
  <url>http://maven.apache.org</url>

  <properties>
      <project.build.sourceEncoding>
          UTF-8
      </project.build.sourceEncoding>
      <maven.test.skip>true</maven.test.skip>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  
  <dependencies>
      <dependency>
          <groupId>org.apache.felix</groupId>
          <artifactId>org.apache.felix.framework</artifactId>
          <version>5.6.1</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.apache.felix</groupId>
          <artifactId>org.apache.felix.eventadmin</artifactId>
          <version>1.2.2</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.jabricks.resources</groupId>
          <artifactId>util-resources</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.jabricks.basegui</groupId>
          <artifactId>gui-widgets</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.jabricks.jpanel</groupId>
          <artifactId>base-jpanel</artifactId>
          <version>1.0.0</version>
          <scope>provided</scope>
      </dependency>
  </dependencies>
  
  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>2.3.2</version>
              <configuration>
                  <source>${maven.compiler.source}</source>
                  <target>${maven.compiler.target}</target>
              </configuration>
          </plugin>
          <plugin>
              <groupId>org.apache.felix</groupId>
              <artifactId>maven-bundle-plugin</artifactId>
              <version>2.3.7</version>
              <extensions>true</extensions>
              <configuration>
                  <instructions>
                     <Bundle-SymbolicName>
                         ${project.groupId}.${project.artifactId}
                     </Bundle-SymbolicName>
                     <Bundle-Name>
                         ${project.name}
                     </Bundle-Name>
                     <Bundle-Version>
                         ${project.version}
                     </Bundle-Version>
                     <Bundle-Activator>
                         ${project.groupId}.JPanelActivator
                     </Bundle-Activator>
                     <Import-Package>
                          javax.swing.*,
                          org.osgi.framework.*,
                          org.jabricks.jpanel.*,
                          org.jabricks.resources
                     </Import-Package>
                  </instructions>
              </configuration>
          </plugin>
      </plugins>
   </build>
</project>

Примечание :
1. Зависимости определены с параметром «scope=provided», т.е. в бандл эти dependencies не должны попасть.
2. В секции <Import-Package> определены пакеты, которые должны быть доступны модулю в режиме run-time. Обратите внимание на связь между секциями <dependencies> и <Import-Package>. Если что-то будет отсутствовать, либо что-то будет лишнее, то плагин BND (maven-bundle-plugin) «скажет» Вам об этом.

Зависимости

Модуль templ-jpanel использует следующие бандлы :

  • util-resources, для получения текущего объекта локализации Locale;
  • gui-widgets, для использования компонентов при формировании интерфейса формы;
  • base-jpanel, базовые классы активатора и интерфейсной формы.

Подключение модуля в приложении

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

  • разместить модуль в поддиректории «configuration/bundles/»;
  • зарегистрировать в файле инициализации бандлов «bundles.ini» наименование модуля : templ-jpanel-1.0.0.jar;
  • определить пункт меню или/и кнопку панели инструментов, параметрами подключения которых указать GAV значения бандла.

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

• groupId : org.jabricks.templates
• artifactId: templ-jpanel
• version : 1.0.0

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

Скачать templ-jpanel

Рассмотренный на странице пример создания интерфейсной панели templ-jpanel в виде проекта IDE Eclipse упакован в архивный файл templ-jpanel.zip (17.4 Кб).

  Рейтинг@Mail.ru