410013796724260
• Webmoney
R335386147728
Z369087728698
Модуль создания главного менюМодуль gui-menu, выполненный по технологии OSGi, предназначен для создания главного меню в приложении Jabricks согласно описанной структуры во внешнем XML-файле. Главная строка меню может состоять из одной или двух частей для отображения пунктов меню либо в левой/правой части главного фрейма, либо в обеих частях. Заголовки пунктов меню определяются текущим значением языка локализации приложения и могут быть изменены в режиме run-time без перезагрузки модуля при смене Locale приложения. Описание бандла gui-menuМодуль gui-menu включает интерфейс MenuService и класс реализации методов интерфейса MenuServiceImpl. Конструктор класса реализации в качестве параметра получает контекст бандла BundleContext. Интерфейс MenuServiceФункциональность модуля gui-menu определяется методами интерфейса MenuService, исходный код которого включает следующие методы :
public interface MenuService
{
public JMenuBar getJMenuBar ();
public void createMenu (Properties props,
String fpath,
ActionListener listener);
public void createMenu (Properties props,
Document doc_menu,
ActionListener listener);
public void changeLocale (Properties props);
public void changeMenuCaption(final String menuName,
final String caption);
public Bundle getLinkedBundle (JMenuItem menuItem);
public void addActionListener(String menuName,
ActionListener listener);
}
Интерфейс MenuService модуля gui-menu определяет методы создания меню типа JMenuBar, смены языка локализации, чтения связанного с пунктом меню бандла и подключение к пункту меню обработчика события. В таблице представлено описание методов.
Примечание : Описание структуры менюСтруктура меню главного фрейма приложения JaBricks описывается в файле configuration/menu.xml. Для описания структуры используются теги и атрибуты. Теги описания структуры меню
Тег menubar является корневым элементом иерархической структуры меню и в интерфейсе не отображается. Тег menu определяет пункты меню в главной строке. Тег stub делит меню на 2 части; все пункты меню menu после заглушки попадают в правую часть меню. Теги menuitem являются дочерними элементами menu и отображаются в выпадающем списке. Каждый пункт меню может иметь несколько menuitem. Тег menuitem также может включать дочерние элементы menuitem, образуя иерархическую структуру. Иерархическая структура меню определяет только именованные пункты меню и связанные с ними бандлы. При выборе/выделении пункта меню приложение стартует связанный с ним бандл. Атрибуты пунктов менюКаждый значимый пункт меню, определенный тегами <menu>, <menuitem>, имеет следующие атрибуты :
Примечание : Пример описания структуры менюСледующий листинг демонстрирует пример описания меню, включающего два пункта (menu.file, menu.view) в левой части меню и один пункт меню (menu.help) — в правой. Левая и правая части главной строки меню отделяются тегом <stub /> Каждый пункт меню содержит по несколько подпунктов меню.
<?xml version="1.0" encoding="UTF-8"?>
<menubar name="mainMenu">
<menu name="menu.file">
<menuitem name="menu.open" enabled="true" />
<menuitem name="separator"/>
<menuitem name="menu.exit" />
</menu>
<menu name="menu.view">
<menuitem name="menu.line" type="check" />
<menuitem name="menu.grid" type="check" />
<menuitem name="menu.navigation"
type="check" enabled="false" />
<menuitem name="separator"/>
<menuitem name="menu.style" >
<menuitem name="menu.style.bold" type="radio" />
<menuitem name="menu.style.normal" type="radio"/>
<menuitem name="menu.style.font" />
</menuitem>
</menu>
<stub />
<menu name="menu.help" >
<menuitem name="menu.settings" image="gear.png"
groupId="com.bundle.settings"
artifactId="form-settings"
version="1.0.0" />
<menuitem name="menu.about" image="question.png"
groupId="com.bundle.about"
artifactId="form-about"
version="1.0.0" />
</menu>
</menubar>
На скриншоте представлено графическое изображение меню, созданное согласно вышеописанной структуре. Пункт меню «Вид» на скриншоте представлен в раскрытом виде. Пункт меню «Справка» (menu.help) имеет два подпункта (menu.settings, menu.about), которые связаны с бандлами атрибутами groupId, artifactId и version. При выборе данных пунктов меню будут стартованы связанные с ними бандлы (см. слушатель событий).
Пример создания менюПредставленный ниже метод createMenu демонстрирует создание Главной строки меню. В качестве параметра метод createMenu получает описанный ниже слушатель событий, который должен обрабатывать события выбора пунктов меню. Если структура файла "configuration/menu.xml" соответствует определенному выше формату, то будет создан объект сервиса меню типа MenuService, возвращающий меню JMenuBar методом getJMenuBar. Если по каким-либо причинам меню не будет создано (отсутствие файла, нарушение структуры), то необходимо обнулить объект управления меню, чтобы избежать возникновения ошибок при дальнейшем его использовании, например, изменения локализации интерфейса.
BundleContext context;
JFrame frame ;
MenuService menu ;
...
private void createMenu(ActionListener listener)
{
if (listener == null) {
menu = null;
return;
}
IResources resources = new ResourcesImpl();
Document doc = resources.readMenuStructure();
if (doc == null) {
menu = null;
return;
}
String sn ;
Properties props;
sn = context.getBundle().getSymbolicName();
props = resources.getBundleResources(sn);
try {
// Создание сервиса меню
menu = new MenuServiceImpl(context);
/*
* Создание Главной строки меню
*/
menu.createMenu(props, doc, listener);
// Подключение строки меню
if (menu.getJMenuBar() != null)
frame.setJMenuBar(menu.getJMenuBar());
else
menu = null;
} catch (Exception e) {}
}
Пример использования gui-menu в приложении JaBricks представлен в Уроке 3. Описание слушателя событийПредставленный ниже слушатель событий menuListener позволяет в автоматическом режиме стартовать бандл при выборе соответствующего пункта меню. Если пункт меню не связан с бандлом, то необходимо в коде описать соответствующий обработчик события. Например, следующий пример демонстрирует старт связанного с «выделенным» пунктом меню бандла.
MenuService menu;
private ActionListener menuListener = new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
JMenuItem menuItem = (JMenuItem) event.getSource();
Bundle bundle = null;
bundle = menu.getLinkedBundle(menuItem);
if ((bundle != null) &&
(bundle.getState() != Bundle.ACTIVE)) {
try {
/* Старт связанного с выделенным пунктом
* меню бандла
*/
bundle.start();
} catch (BundleException e) {}
} else {
/*
* Обработка события по выделению пункта меню,
* не связанного с бандлом
*/
if (menuItem.getName()
.equalsIgnoreCase("menu_name"))
// ...
}
}
};
Обновление заголовков меню при смене LocaleПри смене языка локализации в приложении можно в режиме run-time без перезагрузки бандла gui-menu обновить заголовки пунктов меню. Для этого следует подписаться на рассылку сообщения jabricks/LocaleEvent, отправляемое бандлами form-locale и form-settings. Следующий код демонстрирует чтение соответствующего внешнего файла свойств бандла согласно определенной в приложении locale и обновление наименований пунктов меню.
MenuService menu;
. . .
IResources resources = new ResourcesImpl();
if ((resources != null) && ((menu != null)) {
String sn = context.getBundle().getSymbolicName();
Properties props = resources.getBundleResources(sn);
// Обновление пунктов меню согласно локализации
menu.changeLocale(props);
}
Примечание : пример «организации подписки» на сообщение jabricks/LocaleEvent приведен в описании бандла form-locale. Локализованные наименования пунктов менюЛокализованные наименования пунктов меню хранятся во внешних файлах свойств типа *.properties главного фрейма приложения. Следующий код демонстрирует описание англоязычных заголовков пунктов меню в файле свойств configuration/resources/properties/xxx_en.properties, где 'xxx' соответствует наименованию модуля/бандла главного фрейма приложения JaBricks. menu.file=File menu.exit=Exit menu.view=View menu.line=Line menu.grid=Grid menu.navigation=Navigation menu.style=Style menu.style.bold=Bold menu.style.normal=Normal menu.style.font=Font menu.settings=Settings menu.help=Help Динамическое изменение заголовка пункта менюМодуль gui-menu позволяет в режиме run-time изменить заголовок пункта меню. В качестве примера можно привести пункт меню «Подключения» к серверу БД. Связанный с данным пунктом меню модуль может как устанавливать соединение с сервером БД, так и разрывать соединение. В этом случае пункт меню может иметь заголовок, отражающий наличие или отсутствие соединения. Приведенный в листинге метод changeConnect устанавливает заголовок пункта меню menu_connection в зависимости от наличия соединения (метод isConnected) с сервером БД.
String connection = "menu.connection";
String disconnection = "menu.disconnection";
public void changeConnect(Properties props)
{
String key = null;
String caption = null;
if (isConnected())
key = disconnection;
else
key = connection;
// Чтение свойства
if (props.containsKey(key))
caption = props.getProperty(key);
// Переименование пункта меню
if ((menu != null) && (caption != null))
menu.changeMenuCaption(menu_connection, caption);
}
ПримерПример использования gui-menu представлен в описании к Уроку 3. Версия 1.0.1Версия модуля 1.0.1 поддерживает функциональность предыдущей версии 1.0.0. и позволяет использовать в приложении одинаковые бандлы разных версий. ЗависимостиМодуль gui-menu связан с ресурсным бандлом util-resources для чтения текущего объекта локализации приложения Locale. Подключение модуля к приложениюДля подключения модуля gui-menu к приложению Jabricks необходимо :
GAV параметры модуля form-menu имеют следующие значения :
Подробнее о включении модуля в приложение Jabricks представлено здесь. Скачать gui-menuРассмотренный на странице модуль создания меню gui-menu упакован в архивный файл gui-menu-1.0.1.zip (15.3 Кб). |
