410013796724260
• Webmoney
R335386147728
Z369087728698
Пример окна templ-jdialogПроект templ-jdialog, наследующий свойства базового модуля base-jdialog, можно использовать в качестве шаблона при разработке интерфейсных модулей для приложений на платформе JaBricks. В проекте реализованы механизмы «подписки» на сообщения локализации интерфейса и протоколирования сообщений. Описание проектаШаблон проекта, структура которого представлена на следующем скриншоте, выполнен в IDE Eclipse с использованием фреймворка Maven и включает :
Активатор JDialogActivator и класс формы JDialogForm наследуют свойства базовых классов создания интерфейсного бандла. Описание проекта в pom.xml включает параметры GAV (groupId, artifactId, version), секцию зависимостей <dependencies> и секцию сборки <build>, в которую включена декларацию плагина BND формирования OSGi бандла. Данный шаблон проекта создания бандла с интерфейсом JDialog позволяет существенно ускорить и облегчить разработку новых OSGi бандлов.
Преимущества использования данного проектного шаблона : Класс активатора 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 параметры бандла. Далее текст описания включает несколько секций :
<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>
Примечание : Локализация интерфейса формыРодительский класс активатора JBDialogActivator бандла содержит метод createLocaleSubscriber(), который необходимо вызвать для «подписки» на рассылку сообщений о смене языка локализации. При получении данного типа сообщения вызывается переопределенный метод changeLocale (Locale) активатора бандла. Если метод не переопределить, то будет вызван соответствующий метод родительского бандла. В методе changeLocale (Locale) вызов перенаправляется в интерфейсный класс JDialogForm. На следующем скриншоте представлен интерфейс формы после поступления сообщения об установлении англоязычной локализации Locale. ЗависимостиМодуль templ-jdialog использует следующие бандлы :
Подключение модуля в приложенииДля подключения модуля templ-jdialog в приложение JaBricks необходимо :
GAV параметры модуля templ-jdialog имеют следующие значения :
Подробнее о включении модуля в приложение JaBricks представлено здесь. Скачать templ-jdialogРассмотренный на странице пример создания диалогового окна templ-jdialog в виде проекта IDE Eclipse упакован в архивный файл templ-jdialog.zip (25.9 Кб). |