Афоризм
Большому кораблю – большие в трюме крысы.
Наталья Резник
Последние статьи

 • платформа JaBricks
Платформа OSGi-приложения JaBricks
 • уроки JaBricks
Учебные примеры изучения платформы Jabricks
 • бандл 'О программе'
Модуль представления инфо о программе
 • бандл form-locale
Модуль определения языка локализации приложения
 • бандл util-db
Модуль взаимодействия с СУБД
 • бандл db-connection
Модуль подключения к серверу БД
 • бандлы JaBricks
Бандлы приложения JaBricks

Пример главного фрейма templ-jframe

Проект templ-jframe представляет пример создания главного фрейма приложения Jabricks. На следующем скиншоте представлена структура проекта в среде разработки IDE Eclipse.

Представленный на скриншоте проект создания главного фрейма приложения JaBricks включает :

  • активатор модуля JFrameActivator;
  • интерфейсный фрейм JFrameTempl;
  • ресурсные файлы локализации интерфейса поддиректории properties;
  • проектный файл pom.xml.

Для создания главного фрейма приложения JaBricks необходимо выполнить сборку приложения по технологии OSGi. При описании проектного файла pom.xml следует указать зависимость (dependency) базового фрейма (base-jframe). Классы проекта templ-jframe наследуют свойства классов базового фрейма.

Ниже приводятся листинги описания классов и проектного файла, которые можно использовать при создании главных фреймов приложений на платформе JaBricks.

Листинг активатора JFrameActivator

Активатор главного фрейма наследует свойства активатора базового фрейма JBFrameActivator и реализует функции активатора бандла BundleActivator. В переопределенном методе start формируются подписчики сообщений изменения языка локализации createLocaleSubscriber и запроса контейнера фрейма createJFrameSubscriber. При необходимости можно подключить подписчика сообщения установления соединения с сервером БД (createConnectSubscriber). Данные подписчики слушают поступление соответствущих сообщений от других бандлов приложения.

Методы createMenuListener и createToolbarListener создают объекты Главного меню и панели инструментов для управления стартами бандлов приложения. Описания главного меню и структуры панели инструментов приложения располагается во внешних файлах. Метод createWindowListener создает слушателя фрейма, вызывающего метод останова приложения.

После создания интерфейсного фрейма приложения frame к его меню и панели инструментов подключаются слушатели завершения работы приложения. Соответствующие пункт меню (MENU_exit) и кнопка панели инструментов (TOOLBAR_exit) должны быть описаны во внешних конфигурационных файлах приложения (configuration/menu.xml, configuration/toolbar.xml).

Переопределенный метод saveJFrameData, вызываемый в методе stop() при остановке бандла, сохраняет размеры окна (фрейма) во внешнем файле (gui/templ-jframe-1.0.0.xml), наименование которого состоит из артифакта и версии бандла.

Листинг
package com.bundle.jframe;

/**
 * Активатор бандла создания фрейма OSGi приложения 
 * с использованием JFrame библиотеки SWING 
 */

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.ServiceListener;

import org.jabricks.jframe.JBFrameActivator;

public class JFrameActivator extends JBFrameActivator 
                             implements BundleActivator
{
    private  final  String   MENU_exit    = "menu.exit"   ;
    private  final  String   TOOLBAR_exit = "toolbar.exit";
    //-----------------------------------------------------
    /**
     * Процедура старта; вызывается фреймворком.
     * @param context   
     */
    @Override
    public void start(final BundleContext context)
                                        throws Exception
    {
        super.start (context);

        createLocaleSubscriber ();
//      createConnectSubscriber();
        createJFrameSubscriber ();

        createMenuListener     ();
        createToolbarListener  ();
        createWindowListener   ();

        frame = new JFrameTempl(context); 
        frame.createJFrame(menuListener, toolbarListener);
        
        // Завершение работы программы при выборе 
        // пункта меню MENU_exit
        MenuService ms = frame.getMenuService();
        if (ms != null) {
            ms.addActionListener(MENU_exit, 
                                 new ActionListener() {
                public void actionPerformed
                                 (ActionEvent action) {
                    stop();
                }
            });
        }
        // Завершение работы программы при нажатии на
        // кнопку панели инструментов TOOLBAR_exit
        ToolbarService ts = frame.getToolbarService();
        if (ts != null) {
            ts.addActionListener(TOOLBAR_exit,
                                 new ActionListener() {
                public void actionPerformed
                                 (ActionEvent action) {        	
                    stop();
                }
            });
        }
        // Слушатель фрейма
        frame.getJFrame().addWindowListener(windowListener);
    }
    //-----------------------------------------------------
    public void saveJFrameData() 
    {
        frame.saveJFrameData();
    }
}

Листинг фрейма JFrameTempl

Класс JFrameTempl, предназначенный для создания главного фрейма приложения, включает конструктор и два метода : createJFrame и changeLocale. Конструктор класса передает родителю контекст активатора. Метод createGUI, представленный в листинге, используется в 11 уроке в версии 1.0.1.

Метод createJFrame, получающий в качестве параметров слушателей меню и панели инструментов, создает фрейм JFrame, определяет локализованный заголовок фрейма и делает его видимым. Если фрейм не должен быть развернут во весь экран монитора, то размер его можно ограничить методом setSize и разместить по центру монитора (formCentering).

Метод changeLocale локализует заголовок фрейма, пункты меню и подсказки кнопок панели инструментов. Данный метод вызывается автоматически в режиме «run-time» при изменении языка локализации приложения, т.е. при получении сообщения о смене Locale.

Листинг
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;

import org.jabricks.jframe.JBFrame;
import org.osgi.framework.BundleContext;

import com.bundle.resources.IResources;
import com.bundle.resources.ResourcesImpl;

import org.jabricks.basegui.common.IBaseGuiConstants;

public class JFrameTempl extends JBFrame
                         implements IBaseGuiConstants
{
    //-----------------------------------------------------
    public JFrameTempl (final BundleContext context)
    {
        super(context);
    }
    //-----------------------------------------------------
    public void createJFrame(ActionListener menuListener, 
                             ActionListener toolbarListener)
    {
        super.createJFrame(menuListener, toolbarListener);

        String version = context.getBundle().getVersion()
                                            .toString()
        if (version.equalsIgnoreCase("1.0.1"))
            createGUI();

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

        changeLocale(locale);
      
        jframe.repaint();

        // Открытие окна
        jframe.setVisible(true);
    }
    //-----------------------------------------------------
    /**
     * Процедура смены языка локализации
     */
    @Override
    public void changeLocale(Locale locale)
    {
        /*
         * Внутренние ресурсы : локализованный заголовок
         *                      фрейма приложения
        */
        if (locale != null) {
            ResourceBundle rsc;
            rsc = ResourceBundle.getBundle (RESOURCES_props,
                                            locale);
            jframe.setTitle(rsc.getString(RESOURCE_title));
        }
        /*
         * Внешние ресурсы : локализованные заголовки
         *                   пунктов меню и подсказки 
         *                   кнопок панели инструментов
        */
        IResources resources = new ResourcesImpl();
        if (resources != null) {
            Properties props;
            props = resources.getResources(
                                context.getBundle()
                                       .getSymbolicName());
            // Определение локализационных пунктов меню
            if (menuService != null)
                menuService.changeLocale(props);

            // Определение локализационных подсказок
            if (tbService != null)
                tbService.changeLocale(props);
        }
    }
    //-----------------------------------------------------
    private void createGUI()
    {
        JPanel pnlTop    = new JPanel();
        JPanel pnlCenter = new JPanel();
        JPanel pnlBottom = new JPanel();

        pnlTop   .setBackground(new Color(216, 216, 216));
        pnlCenter.setBackground(new Color(240, 240, 240));
        pnlBottom.setBackground(new Color(216, 216, 216));

        jframe.add(pnlTop   , BorderLayout.NORTH );
        jframe.add(pnlCenter, BorderLayout.CENTER);
        jframe.add(pnlBottom, BorderLayout.SOUTH );

        JLabel lblTop    = new JLabel(" ");
        JLabel lblBottom = new JLabel(" ");

        Font font
        font = new Font("Courier New", Font.PLAIN, 48);
        lblTop   .setFont(font);
        lblBottom.setFont(font);

        pnlTop   .add(lblTop   );
        pnlBottom.add(lblBottom);
    }
}

Проектный файл pom.xml

Представленный ниже листинг файла pom.xml позволяет выполнить сборку главного фрейма приложения JaBricks по технологии OSGi. Проектный файл определяет GAV-параметры бандла и необходимые для разработки в IDE зависимости (секция dependencies). Плагин maven-bundle-plugin регистрирует в манифесте используемые модулем пакеты (секция <Import-Package>).

Листинг
<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.jframe</groupId>
    <artifactId>templ-jframe</artifactId>
    <packaging>bundle</packaging>
    <version>1.0.0</version>

    <name>JFrame 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.jframe</groupId>
            <artifactId>base-jframe</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jabricks.menu</groupId>
            <artifactId>gui-menu</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jabricks.toolbar</groupId>
            <artifactId>gui-toolbar</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}
                            .JFrameActivator
                        </Bundle-Activator>
                        <Import-Package>
                            javax.swing.*,
                            javax.xml.parsers, 
                            org.osgi.framework.*,
                            org.jabricks.jframe.*,
                            org.jabricks.basegui.*,     
                            org.jabricks.resources,
                            org.jabricks.menu,
                            org.jabricks.toolbar
                        </Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Зависимости

Интерфейсный модуль templ-jframe функционирует вместе со следующими бандлами приложения Jabricks :

gui-widgets библиотека компонентов и глобальных констант приложения
base-jframe базовый (родительский) модуль формирования фрейма приложения
util-resources модуль управления внешними ресурсами приложения
gui-menu модуль формирования главного меню приложения
gui-toolbar модуль формирования панели инструментов

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

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

  • разместить модуль в поддиректории «configuration/bundles/»;
  • внести в файл инициализации бандлов «configuration/bundles.ini» запись : templ-jframe-1.0.0.jar;
  • (необязательно) определить структуры главного меню configuration/menu.xml и панели инструментов configuration/toolbar.xml.

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

• groupId : org.jabricks.jframe
• artifactId : templ-jframe
• version : 1.0.0

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

Скачать templ-jframe

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

  Рейтинг@Mail.ru