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 Кб). |
