Афоризм
У тебя ноги уже кончились, а платье еще не началось!
Лариса Гузеева
Последние статьи

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

Урок 11. Главный фрейм

В данном уроке остановимся на особенностях разработки главного фрейма приложения на платформе JaBricks. Необходимо отметить, что в конфигурацию приложения в обязательном порядке включается бандл, выполняющий функции главного фрейма. Что представляет из себя главный фрейм?

Главный фрейм – это бандл, т.е. программный jar-модуль, выполненный по технологии OSGi. Бандл в обязательном порядке должен включать активатор, реализующий функции интерфейса BundleActivator. Основные методы активатора start и stop вызываются OSGi-фреймворком для старта и останова бандла. В приложение jabricks включен OSGi-фреймворк Felix, который может по команде стартовать главный фрейм. Эту команду Felix получает, если в файле конфигурации приложения «configuration/bundles.ini» имеется описание бандла с атрибутом @main.

Структура главного фрейма

Скачаем архив проекта templ-jframe и «развернем» его. Проект создан в среде разработки IDE Eclipse. Можно, конечно, было бы внести изменения в наименование бандла/проекта. Для этого следует переименовать директорию, внести изменения в наименование проекта (<name>) в файле «.project» и переименовать artifactId проекта в «pom.xml». На этом все приготовления проекта к использованию заканчились бы. Но мы не будем переименовать проект/бандл, как это выполнено в уроках 12 и 13, а будем вносить изменения в интерфейс существующего проекта. Импортируем проект в IDE.

На скриншоте слева представлена структура проекта templ-jframe в IDE Eclipse, предназначенного для создания главного фрейма приложения JaBricks. Экземпляры классов JFrameActivator и JFrameTempl выполняют соответственно функции активатора и фрейма JFrame. Ресурсные файлы «resources/properties/propsXX.properties» содержат внутренние локализованные описания главного фрейма. Проектный файл pom.xml включает зависимости главного фрейма и плагины сборки бандла.

Интерфейсная часть главного фрейма создает окно JFrame, в котором размещает строку «Главного меню» и/или «панель инструментов» при наличии в конфигурации соответствующих описаний (configuration/menu.xml, configuration/toolbar.xml) . То есть, интерфейсная часть главного фрейма предназначена для формирования приложения с использованием библиотеки Swing.

Примечание: окно JFrame использует макет BorderLayout; панель инструментов размещается в верхней части окна (BorderLayout.NORTH). Не занимайте без необходимости данную область фрейма, в противном случае создавайте интерфейс фрейма без использования панели инструментов, либо переносите её в другую часть фрейма.

Полное описание данного проекта представлено на странице разработки главного фрейма.

Управление бандлами

Главный фрейм приложения для формирования «Главного меню» и «панели инструментов» использует соответствующие модули. Описания структур «главного меню» и «панели инструментов», хранящиеся во внешних конфигурационных файлах («configuration/menu.xml», «configuration/toolbar.xml»), включают связи с бандлами; допускается использование в описании (конфигурации) разноверсионных бандлов. Данным модулям главный фрейм «делегирует» старт бандлов приложения. То есть, при нажатии на одну из кнопок панели инструментов, либо при выборе пункта меню, модули gui-toolbar и gui-menu стартуют соответствующий бандл.

Таким образом, главный фрейм выполняет функцию «дирижера» с использованием модулей gui-toolbar и gui-menu, стартующих бандлы. Интерфейсные бандлы приложения могут создавать диалоговые окна типа JDialog, либо панели типа JPanel. Во втором случае бандлам потребуется контейнер главного фрейма для размещения в нём интерфейсной панели. С этой целью они обращаются к главному фрейму, который организует взаимодействие с бандлами приложения.

Взаимодействие с бандлами

Бандлы, формирующие панели JPanel для размещения своего интерфейса, нуждаются в контейнере, который им предоставляет главный фрейм. Для взаимодействия с такими бандлами активатор главного фрейма организует механизм «публикации/подписки». С этой целью главный фрейм подписывается на сообщение запроса контейнера «jabricks/Container/Request», отправляемого стартующим бандлом. Получив такое сообщение главный фрейм отправляет сообщение «jabricks/Container/GUISave» ранее стартованному бандлу, занимающему место в контейнере, чтобы этот бандл при необходимости сохранил изменяемые настройки интерфейса (положения сплитеров, размеры колонок таблиц). После этого, ранее стартованный бандл оcтанавливается и его панель удаляется из контейнера главного фрейма, а вновь стартованный бандл получает от главного фрейма по подписке сообщение «jabricks/Container/Request», включающего контейнер для размещения своей интерфейсной панели.

Создание главного фрейма

Ниже представлен листинг класса JBFrame. В предыдущих уроках был использован главный фрейм templ-jframe версии 1.0.0. Версия бандла в проекте определяется в pom.xml. В данном уроке следует использовать версию 1.0.1. В этом случае в методе создания интерфейса createJFrame(menuListener, toolbarListener) будет вызываться процедура createGUI, которая создаст заданный интерфейс. Описание остальных файлов, включая проектный файл pom.xml, где определяется версия бандла, Вы можете увидеть на странице разработки главного фрейма.

Листинг
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.getBundleResources(
                                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);
    }
}

Интерфейс главного фрейма после старта представлен на следующем скриншоте.

Связанные страницы

Список уроков
Предыдующий, 10-й урок
Следующий, 12-й урок

Скачивание файлов

Для выполнения данного задания Вам необходимо только скачать необходимые бандлы, ресурсные файлы, файл описания панели инструментов и файл описания инсталлируемых бандлов. Перечисленные файлы собраны и упакованы в один архивный файл configuration.lesson11.zip (329 Кб).

Скачайте и «разверните» архив configuration.lesson11.zip, перенесите файлы в структуру, представленную на странице описания платформы JaBricks.

Скачать проект главного фрейма Вы можете на странице описания templ-jframe.

  Рейтинг@Mail.ru