Використання XML для генерації панелі меню у Swing
Для зберігання всього процесу генерації меню будь-якої складності, вирішив я вдатися до сили під назвою XML. З його допомогою можна описати меню, як ми хочемо його бачити, а завдяки класу-утиліті, який не забудемо створити, наш XML буде розпарений і в результаті можна буде отримати те, заради чого все це і починається - меню будь-якої складності. Якщо вас це зацікавило, ласкаво просимо під хаброкат.
Отже, спочатку опишемо меню, яке ми хочемо прив'язати до нашого UI. Як приклад я вирішив використовувати трохи урізане меню, в основу якого лягло меню, яке багато хто з нас спостерігав у Google Docs (нехай простить мене Google):
- File -> New -> Список документів для створення
- File -> Open
- File -> Download as -> варіанти закачування
- File -> Print
- Edit -> Undo
- Edit -> Redo
- Edit -> Cut
- Edit -> Copy
- Edit -> Paste
- Format -> Paragraph Styles -> Normal Text -> варіанти формату звичайного тексту
- Format -> Paragraph Styles -> Heading -> варіанти формату заголовка
- Format -> Paragraph Styles -> Options -> різні налаштування стилів
- Help -> Report an issue
- Help -> Report abuse
- Help -> Keyboard shortcuts
Опис елементів меню у форматі XML
Перед початком створення XML файлу, що описує наше, частково запозичене (тільки як приклад), гарне меню, визначимо які елементи в ньому є.
В першу чергу це JMenuBar, панель на якій розташовуватимуться описані нижче елементи. І ось цюпанель ми і витягуватимемо після обробки XML.
Далі у нас слідують представники JMenu - меню та підменю власною персоною (File, Edit, Paragraph Styles і т.д.). А також JMenuItem - елементи всіх меню та підменю (Open, Copy, Paste, Report abuse і т.д.). І, звичайно ж, роздільники (сепаратори) — горизонтальні лінії, за допомогою яких елементи меню об'єднуються в логічні групи.
У кожного елемента є ще ряд властивостей, таких як — ім'я елемента (по ньому ми зможемо звернутися до елемента, що цікавить нас з коду), текст, наявність картинки біля тексту, комбінація клавіш, за якою можна сфокусуватися на елементі за допомогою клавіатури (т.зв. мнемоніки - відображаються у вигляді підкресленого елемента в імені і викликаються комбінацією alt + виділений_символ_в_імені Наприклад, alt + F, для відкриття меню File) і клавіатурне скорочення (т.зв. акселератор - відображається у вигляді комбінації клавіш поряд з елементом меню використання, без входження в саме меню (наприклад, Ctrl+O для відкриття файлу). Також елемент може бути активним та неактивним (Edit -> Cut, якщо не виділено текст).
З цеглинами, з яких складається меню, ознайомилися. Залишилося розглянути теги XML і імена властивостей, які будуть відповідати елементам, описаним вище.
Теги: JMenuBar - , JMenu - , JMenuItem - , роздільник -
Властивості: ім'я – name, текст – text, картинка – image, мнемоніка – mnemonic, акселератор – accelerator, доступність елемента – isEnabled.
Знайомтесь, XML, що описує меню!
Визначившись з XML елементами нашого меню, можна негайно приступити до опису меню, яке ми хочемо отримати:
XML-обробник
Тепер, коли ми описали наше меню в рамках XML, залишилося його лише розпарити. Для роботиз нашою XML скористаємося Java пакетом org.xml.sax (з API можна ознайомитись тут і тут). За обробку елементів нашої XML структури відповідатиме клас XMLMenuHandler, що розширює клас DefaultHandler, який у свою чергу реалізує інтерфейс ContentHandler та ряд інших, не менш корисних інтерфейсів:
Опишемо клас, який буде відповідати за завантаження XML і активно використовувати наш обробник:
А тепер подивимося на виконану роботу в справі - застосуємо описане в XML меню до простенького UI:
Запустивши нашу програму, ми отримаємо приблизно наступне віконце з меню (сруктура якого така ж, як було описано вище):

Висновок
Тепер, якщо з'явиться необхідність у побудові гіллястого меню, все що необхідно буде зробити, так це створити відповідний XML файл, в якому будуть описані всі елементи рядка меню з їхніми властивостями, а також підключити до проекту два класи XMLMenuHandler та XMLMenuParser (можна навіть об'єднати їх) , зробивши XMLMenuHandler внутрішнім класом) і використовувати цей набір супів, як було показано вище в прикладі.
Дякую за увагу і вітаю з днем програміста.
Хардкорна конфа за С++. Ми запрошуємо лише профі.