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