Рейтинг@Mail.ru

Наши друзья и партнеры

UnixForum
купить дешевый 
компьютер родом из Dhgate.com




Библиотека сайта rus-linux.net

Фреймворк Violet

Глава 22 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: "Violet", глава из книги "The Architecture of Open Source Applications"
Автор: Cay Horstmann
Перевод: Н.Ромоданов

22.7. Это не фреймворк приложений Swing

В большинстве фреймворков графического пользовательского интерфейса GUI заложена некоторая идея о том, как в приложении происходит управление набором документов с использованием меню, панелей инструментов, строк состояний и т. д. Однако это никогда не было частью Java API. JSR 296 [5] должен был предоставить базовый фреймворк для приложений Swing, но в настоящее время он не действует. Таким образом, у авторов приложений Swing есть два варианта: самостоятельно изобретать велосипед или полагаться на фреймворк сторонних разработчиков. В то время, когда был написан Violet, первыми фреймворками приложений, которые обычно выбирались, были платформы Eclipse и NetBeans, каждая из которых в то время казалась слишком утяжеленной. (В настоящее время есть более широкий выбор, в том числе форки JSR 296, например, GUTS [6]). Таким образом, в Violet потребовалось заново изобретать механизмы для работы с меню и внутренними фреймами.

В Violet вы можете указать пункты меню в файлах свойств, например:

file.save.text=Save
file.save.mnemonic=S
file.save.accelerator=ctrl S
file.save.icon=/icons/16x16/save.png

Утилита method создает пункт меню используя для этого префикс (здесь — file.save). Суффиксы .text, .mnemonic и так далее, являются тем, что сегодня назвали бы «конфигурационным соглашением». Очевидно, что использование файлов ресурсов для описания этих параметров гораздо лучше, чем создание меню с вызовами API, поскольку здесь проще применять локализацию. Я повторно использовал этот механизм в другом проекте с открытым исходным кодом - в среде GridWorld, предназначенной для изучения информатики в средней школе [7].

Приложения, такие как Violet, позволяют пользователям открывать несколько «документов», в каждой из которых есть граф. Когда был написан первый вариант Violet, то тогда все еще применялся обычный многодокументный интерфейс (MDI). В MDI основной фрейм имел меню, и каждый документа отображается во внутреннем фрейме, имеющим название, но не имеющим меню. Каждый внутренний фрейм находился внутри основного фрейма и пользователь мог изменить его размер или его минимизировать. Внутренние фреймы могли располагаться каскадно или плитками.

Многим разработчикам не нравится MDI, и поэтому этот стиль пользовательского интерфейса вышел из моды. Какое-то время предпочтение отдавалось однодокументному интерфейсу (SDI), в котором приложение отображает несколько фреймов верхнего уровня; возможно предпочтение отдавалось потому, что этими фреймами можно было управлять с помощью инструментальных средств стандартного окна операционной системы. Когда стало ясно, что наличие большого количества окон верхнего уровня в конце концов не так уж и хорошо, появился интерфейс со вкладками, в котором несколько документов снова находятся в одном фрейме, но теперь все они отображаются в полном размере и выбираются с помощью вкладок. Это не позволяет пользователям сравнивать два документа, помещая их рядом друг с другом, но, кажется, этот подход победил.

Первоначальная версия Violet использовала интерфейс MDI. В Java API есть возможности использовать внутренние фреймы, но я должен был добавить поддержку для размещения фреймов в виде плиток и для каскадного размещения. Александр перешел на интерфейс с вкладками, который несколько лучше поддерживается в Java API. Было бы желательно иметь фреймворк приложения, в котором политика отображения документа была бы прозрачной для разработчика и, возможно, выбиралась бы пользователем.

Александр также добавил поддержку боковых панелей, панели приглашения и заставки. В идеале все это должно быть частью фреймворка приложений на Swing.


Продолжение статьи: 22.8. Операции Undo/Redo.

Если вам понравилась статья, поделитесь ею с друзьями: