Афоризм
Украсьте мир отсутствием своим.
Наталья Резник
Последние статьи

 • Домашние финансы
Приложение учета домашних финансов
 • Сохранение значений
Сохранение и восстановление значений компонентов
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • Android и OSGi
Старт OSGi-фреймворка Felix в android устройстве
 • Загрузка драйвера
Динамическая загрузка JDBC-драйвера
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
 • уроки JaBricks
Учебные примеры изучения платформы Jabricks
 • бандл 'О программе'
Модуль представления инфо о программе
 • бандл form-currencies
Модуль управления справочником валют
 • бандлы JaBricks
Бандлы приложения JaBricks
Поддержка проекта

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

 • Webmoney
  R335386147728
  Z369087728698

Пример окна templ-jdialog

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

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

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

JDialogActivator.java активатор бандла,
JDialogForm.java интерфейсное диалоговое окно,
properties набор локализованных ресурсов формы,
pom.xml проектный файл.

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

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

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

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

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

В классе активатора переопределены методы start, changeLocale и changeConnect. Метод start вызывается OSGi-фреймворком при старте модуля. В методе start создается интерфейсная форма JDialogForm, к кнопкам которой подключаются соответствующие обработчики нажатий. Так, при нажатии на кнопку btnOk в систему протоколирования отправляется сообщение. При нажатии на кнопку btnClose бандл останавливается и интерфейсная форма закрывается. Остановить бандл можно также нажатием на кнопку закрытия формы (верхний правый угол).

После создания интерфейсного окна в методе start вызываются родительские методы «подписки» на сообщения локализации интерфейса и подключения к серверу БД. Родительские методы changeLocale (locale) и saveComponentParams переопределены. В методе changeLocale вызывается соответствующая процедура интерфейсного класса для обновления локализованных надписей формы.

В методе stop, который в данном активаторе не переопределяется, родительский бандл останавливает все подключенные сервисы. В методе closeForm вызывается переопределенная процедура saveComponentParams, сохраняющая настройки интерфейса, касающиеся как размеров окна, так и (в случае наличия в интерфейсе) положения разделителей JSplitPane и размеров колонок таблицы JTable.

Листинг
import javax.swing.JFrame;

import java.util.Locale;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.ActionListener;

import org.osgi.framework.BundleContext;

import org.jabricks.db.DAOImpl;
import org.jabricks.db.objects.Connect;
import org.jabricks.resources.IResources;
import org.jabricks.resources.ResourcesImpl;
import org.jabricks.jdialog.JBDialogActivator;
import org.jabricks.basegui.interfaces.IBaseGuiConstants;

public class JDialogActivator extends JBDialogActivator 
                              implements IBaseGuiConstants
{
    private  JDialogForm  form = null;
    //-----------------------------------------------------
    /**
     * Процедура старта, вызывается фреймворком
     * @param context   
     */
    @Override
    public void start(final BundleContext context) 
                                         throws Exception {
        super.start(context);

        JFrame.setDefaultLookAndFeelDecorated(true);

        form = new JDialogForm(context);

        form.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                form.setVisible(false);
                try {
                    // Останов бандла
                    context.getBundle().stop();
                } catch (Exception e) {}
            }
        });
        form.btnOk   .addActionListener(okListener);
        form.btnClose.addActionListener(closeListener);
        
        form.repaint();
               
        // Открытие окна
        form.setVisible(true);

        // Подключение слушателей
        createLocaleSubscriber();
    }
    //-----------------------------------------------------
    /**
     * Метод закрытия формы
     */
    private void closeForm()
    {
        saveGuiParams();
        form.setVisible(false);
        form.dispose();
        try {
            context.getBundle().stop();
        } catch (Exception e) {}
    }
    //-----------------------------------------------------
    @Override
    public void changeLocale (Locale locale) 
    {
        form.changeLocale(locale);
    }
    //-----------------------------------------------------
    ActionListener closeListener = new ActionListener()
    {
        public void actionPerformed(ActionEvent arg0)
        {
            closeForm();
        }
    };
    //-----------------------------------------------------
    ActionListener okListener = new ActionListener()
    {
        public void actionPerformed(ActionEvent arg0)
        {
            logMessage(LOG_LEVEL_OSGi, 
                      "JDialogActivator : OK click");
        }
    };
    //-----------------------------------------------------
    public void saveComponentParams() 
    {
        if (form != null)
            form.saveComponentParams();
    }
}
 

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

Форма JDialogForm, интерфейс которой представлен на следующем скриншоте, включает пустое поле, подсвеченное красным цветом и кнопки управления. Если версия бандла будет отличать от '1.0.0', то поле будет подсвечено синим цветом. Данный бандл первой версии используется в нескольких уроках. А в четвертом уроке «Многоверсионность» данный бандла используются в двух разных версиях; разные цвета позволяют определить стартованный бандл.

Активатор к кнопкам подключает слушателей. При нажатии на кнопку ОК в систему логирования отправляется сообщение о нажатии на кнопку. При нажатии на кнопку 'Закрыть' бандл останавливается и форма закрывается. При остановке бандла OSGi-фреймворк переводит его в состояние 'RESOLVED'.

Класс JDialogForm наследует свойства базового интерфейсного класса JBDialog. Конструктор класса в качестве параметра получает контекст бандла и передает его суперклассу, который определяет текущую Locale. В зависимости от установленного в приложении языка локализации будут загружены соответствующие ресурсы resources, которые используются для формирования интерфейса формы.

Интерфейс формы создается двумя методами : createGUI() и createButtons(). В методе createGUI вызывается соответствующий метод суперкласса super.createDesk() для создания панели pnlDesk, которая используется для размещения визуальных компонентов. Метод createButtons создает панель с кнопками управления.

Изменение локализации интерфейса выполняется в методе changeLocale (Locale), который вызывается из активатора при поступлении соответствующего сообщения.

Листинг
import java.awt.*;

import javax.swing.*;

import org.jabricks.jdialog.JBDialog;
import org.osgi.framework.BundleContext;
import org.jabricks.resources.IResources;
import org.jabricks.resources.ResourcesImpl;

import java.util.Locale;
import java.util.ResourceBundle;

public class JDialogForm extends JBDialog
{
    private    JTextPane   tp                 = null;
    private StringBuffer   sb                 = null;

    private  int           DEFAULT_WIDTH      = 420;
    private int            DEFAULT_HEIGHT     = 315;

    public  JButton        btnOk              = null;
    public  JButton        btnClose           = null;
    private ResourceBundle resources          = null;

    private final String RESOURCES_btn_ok     = "btn.ok"   ;
    private final String RESOURCES_btn_cancel = "btn.close";

    private final String RESOURCES ="properties/properties";
    //-----------------------------------------------------
    public JDialogForm(final BundleContext context)
    {
        super(context);

        this.setVisible(false);

        IResources rsc = new ResourcesImpl();
        // Определение иконки
        if (rsc != null)
            setIconImage(rsc.getAppIcon());

        readComponentParams();
        if (form_dim != null) {
            setSize(form_dim);
            DEFAULT_WIDTH  = form_dim.width;
            DEFAULT_HEIGHT = form_dim.height;
        }
        // Создание интерфейса GUI
        createGUI();

        // Контейнер окна
        Container container = getContentPane();
        
        // Размещение панели pnlDesk
        container.add(pnlDesk, BorderLayout.CENTER);
        // Размещение панели с кнопками
        container.add(createButtons(), BorderLayout.SOUTH);

        // Локализация интерфейса
        changeLocale (locale);

        // Центрирование формы
        formCentering(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        // Расположение поверх остальных окон
        setAlwaysOnTop(true);

        this.setVisible(true);
    }
    //-----------------------------------------------------
    /**
     * Создание интерфейса рабочей области формы
     */
    private void createGUI()
    {
        // Создание рабочей области
        super.createDesk();
        boolean first = context.getBundle()
                               .getVersion()
                               .toString()
                               .equalsIgnoreCase("1.0.0");
        if (first)
            pnlDesk.setBackground(Color.red);
        else
            pnlDesk.setBackground(Color.blue);
    }
    //-----------------------------------------------------
    /**
     * Создание панели кнопок управления
     * @return панели управления JPanel
     */
    private JPanel createButtons()
    {
        String caption = EMPTY;
        // Кнопка ОК в панель
        btnOk = new JButton(caption);
        // Кнопка Закрыть
        btnClose = new JButton(caption);

        Dimension dim;
        dim = new Dimension(BUTTON_width+15,BUTTON_height);

        btnOk   .setPreferredSize(dim);
        btnClose.setPreferredSize(dim);
        
        /*
         * Создание панели 'pnlButtons' с последовательным
         * расположением компонентов и выравниванием по 
         * правому краю 'flow'
         */
        JPanel flow = super.createButtonsPanel(); 
        pnlButtons.add (btnOk   );
        pnlButtons.add (btnClose);

        return flow;
    }
    //-----------------------------------------------------
    /**
     * Процедура локализации интерфейса
     * @param locale объект локализации
     */
    public void changeLocale (Locale locale)
    {
        super.changeLocale(locale);

        resources = ResourceBundle.getBundle (RESOURCES, 
                                                   locale);
        String ok      = RESOURCES_btn_ok;
        String cancel  = RESOURCES_btn_cancel;
        String caption = RESOURCE_title;

        if (resources != null) {
            caption = resources.getString(RESOURCE_title);
            ok      = SPAN_normal +
                      resources.getString(ok);
            cancel  = SPAN_normal +
                      resources.getString(cancel);
        }
        this    .setTitle(caption);
        btnOk   .setText (ok     );
        btnClose.setText (cancel );
    }
}
 

Ресурсы модуля

Внутренние ресурсы модуля, определенные в директории "properties", используются для локализации интерфейса формы. Для каждого языка локализации имеется свой файл ресурсов. В следующем листинге представлено содержимое двух ресурсных файлов.

// properties_ru.properties 
title=\u0424\u043E\u0440\u043C\u0430 JDialog
btn.ok=\u041E\u041A
btn.close=\u0417\u0430\u043A\u0440\u044B\u0442\u044C

// properties_en.properties 
title=Form JDialog
btn.ok=OK
btn.close=Close

Обращение к внутренним ресурсам бандла и определение заголовка формы продемонстрировано в следующем примере :

Locale          locale    = new Locale("RU_ru");
String          RESOURCES = "properties/properties";
String          title     = "title";
ResourceBundle  resources;

resources = ResourceBundle.getBundle (RESOURCES, locale);

if (resources != null)
    title = resources.getString(title);
this.setTitle(title);

Для получения внешних ресурсов бандла, хранящихся в конфигурации приложения, следует использовать бандл util-resources.

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

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

  • properties — секция определения кодировки, флага игнорирования выполнения тестов и версии компилятора;
  • dependencies — секция определения используемых в проекте зависимостей :
    • org.apache.felix.framework — фреймворк;
    • org.apache.felix.eventadmin — обработчик событий;
    • util-resources — модуль ресурсов;
    • gui-widgets — модуль компонентов формирования интерфейса;
    • base-jdialog — модуль базовых классов.
  • 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-jdialog</artifactId>
  <packaging>bundle</packaging>
  <version>1.0.0</version>

  <name>JDialog 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.db</groupId>
          <artifactId>util-db</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-jdialog</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}.JDialogActivator
                     </Bundle-Activator>
                     <Import-Package>
                          javax.swing.*,
                          org.osgi.framework.*,
                          org.jabricks.basegui.*,
                          org.jabricks.jdialog.*,
                          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) «скажет» Вам об этом.

Локализация интерфейса формы

Родительский класс активатора JBDialogActivator бандла содержит метод createLocaleSubscriber(), который необходимо вызвать для «подписки» на рассылку сообщений о смене языка локализации. При получении данного типа сообщения вызывается переопределенный метод changeLocale (Locale) активатора бандла. Если метод не переопределить, то будет вызван соответствующий метод родительского бандла. В методе changeLocale (Locale) вызов перенаправляется в интерфейсный класс JDialogForm.

На следующем скриншоте представлен интерфейс формы после поступления сообщения об установлении англоязычной локализации Locale.

Зависимости

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

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

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

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

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

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

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

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

Скачать templ-jdialog

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

  Рейтинг@Mail.ru