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