Наконец-то Sun вняла жалобам на неадекватность Abstract Windowing Toolkit (AWT). Разработанный ею набор классов Java Foundation Classes (JFC) предоставляет разработчикам богатый инструментарий, позволяющий создавать на Java пользовательские интерфейсы высокого уровня. Автор данной статьи подробно рассматривает JFC, сравнивает его с Application Foundation Classes (AFC) компании Microsoft и дает обзор ряда посвященных JFC выступлений на недавно прошедшей конференции.

Java Foundation Classes - это разрабатываемый Sun новый набор классов для создания пользовательских интерфейсов, который должен прийти на смену AWT (Abstract Windowing Toolkit), не отвечающего требованиям программистов. JFC поставляется в составе JDK 1.2 (см. "Дополнительная информация").

Факты о JFC

С выпуском Java Development Kit версии 1.1 Sun во многих отношениях усовершенствовала платформу Java, добавив модули, необходимые для разработки крупных распределенных приложений. К таким модулям относятся средства доступа к базам данных JDBC, компонентная архитектура JavaBeans и классы работы с распределенными объектами RMI. JDK 1.2 отличается улучшениями лишь в одном направлении, но столь важном для разработчиков, что эту версию можно считать не менее значительной, чем 1.1. Центральная "тема" JDK 1.2 - пользовательский интерфейс (UI), который реализуется с помощью Java Foundation Classes (JFC).

Предварительные версии наиболее крупной части JFC были доступны под кодовым названием "Swing" уже несколько месяцев назад. Как сообщил разработчик Java из PeopleSoft Рик Фрост, Swing версии 0.5 коренным образом отличается от Swing 0.3. В документации к версии 0.5 Sun утверждает, что "в основном, библиотеки swing, border, event, table, target, text, tree и undo останутся в финальной версии без изменений". "API версии 0.5 действительно принял стабильную форму", - подтвердил Фрост. В настоящее время на Web-узле Sun доступна для загрузки версия 0.6.1, а финальная версия JFC 1.1 (работающая с JDK 1.1) должна выйти в самое ближайшее время. Она войдет в состав JDK 1.2, первая бета-версия которого вышла в декабре 1997 г., а финальная появится во втором квартале текущего года.

В ходе выступления на SIGS Conference for Java Development в сентябре, озаглавленного "Возникновение Java-реальности", популяризатор Java из Sun и автор статей в JavaWorld Мико Матсумура продемонстрировал воодушевленной аудитории "Swing", главный компонент JFC. JFC был также предметом обсуждения на двух из 60 технических заседаний конференции, а отдельное заседание было посвящено сравнению JFC с AFC.

На повестке конференции SIGS стояло два основных вопроса о JFC:

1. Является ли он достойной заменой AWT?

2. Что особенного может быть в очередном наборе классов для создания пользовательских интерфейсов?

Мико сказал о JFC следующее:

"Чтобы рассмотреть JFC в нужном контексте, необходимо понять, для решения каких задач он предназначен. Изначально для реализации функций графического пользовательского интерфейса в Java служил Abstract windowing Toolkit (AWT), основанный на peer-компонентах (т.е. на платформенно-зависимых представлениях графических элементов). Это требовалось для достижения функционального единообразия интерфейсов на различных системах. Однако, многие устройства (телефоны, например), обладают слишком маленькими экранами для воспроизведения диалогов целиком. Для решения этой проблемы в peer-системе предусмотрена возможность использования физических клавиш телефона в качестве AWT-клавиш. Таким образом обеспечивается возможность работы AWT на самых разнообразных аппаратных платформах. Однако, AWT не позволяет добиться единообразия внешнего вида интерфейсов, ибо он зависит от внешнего вида родительской ОС.

Peer-методология породила две проблемы: 1) задача оказалась более сложной, чем предполагалось, из-за чего возникло множество ошибок; и 2) функционального единообразия оказалось недостаточно - появилась необходимость в единообразии внешнего вида. В AWT из JDK 1.2 многие ошибки исправлены, но для достижения единообразия внешнего вида требуется принципиально новое решение.

JFC обеспечивает возможность создания пользовательских интерфейсов (UI), которые на всех платформах будут выглядеть одинаково. Важно также отметить, что в JFC реализована поддержка множества функций двумерной графики и функций буксировки объектов (drag-and-drop) на уровне ОС. Таким образом, JFC представляет собой богатый инструментарий для создания приложений и апплетов оконного типа. AWT, в то же время, остается средством создания peer-компонентов, работающих на разнообразных устройствах."

JFC создан на базе архитектуры AWT, но содержит совершенно новые "легковесные" элементы UI, не являющиеся peer-компонентами. Поскольку Sun не хочет ограничивать сферу применения Java одними лишь настольными системами, поддержка peer-компонентов в будущих версиях JDK сохранится, поэтому разработчикам старых интерфейсов не придется переписывать их заново. Однако достаточно одного взгляда на примеры, прилагаемые к Swing, чтобы убедиться в том, что старые компоненты больше в настольных приложениях и апплетах использоваться не будут. Детальной и убедительной демонстрацией большинства компонентов JFC может послужить, в частности, приложение SwingSet, входящее в комплект Swing 0.6.1 (см. "Дополнительная информация").

Отличительные черты JFC

Отличительными чертами JFC являются компоненты, API двумерной графики (2D API), настраиваемый внешний вид (pluggable look and feel), функции буксировки, усовершенствованные функции работы с текстом и поддержка доступности (accessibility support). Ниже они рассматриваются подробно.

Компоненты

Все AWT-компоненты имеют свои аналоги в JFC, причем в большинстве своем они значительно улучшены. Например, клавиши, ярлыки, позиции меню, списки и выпадающие списки могут содержать не только изображения, но и текст. Имеется также множество новых компонентов, в частности - таблица, дерево, индикатор уровня, окошко помощи по инструменту, инструментальная линейка, панель с закладками и скользящий рычажок. Многие из этих элементов уже появились в продуктах независимых компаний (например, в JWidgets компании Rogue Wave и JClass компании KL Group), но реализация Sun - ничуть не хуже. Как набор стандартных компонентов, JFC очень впечатляет.

2D API

Появления этого API-интерфейса разработчики, которых не устраивали скудные возможностями java.awt.Graphics, ждали с нетерпением. 2D API был создан в сотрудничестве с Adobe Systems. Он расширяет возможности AWT, обеспечивая возможность работы с независимой от разрешения и устройства вывода графикой. API поддерживает функции прозрачности, макетирования текста, кривые Безье и сглаживание контуров. На базовой странице Sun по 2D API (см. "Дополнительная информация") можно прочитать следующее: "Java 2D API представляет собой набор классов для работы с двумерной графикой, включая текст, растровые и векторные изображения. В API реализована поддержка наложения изображений и альфа-каналов. Имеется ряд классов для преобразования палитр и цветокоррекции, а также богатый набор операторов для вывода работы изображениями на экране.

Настраиваемый внешний вид

Во времена зарождения разработки кросс-платформенного ПО многие компании переносили свои приложения, не меняя их интерфейса в соответствии с канонами новой ОС. Пользователи не особо жаловали такие "чуждые" приложения. Постепенно компании осознали, что свойственный используемой ОС внешний вид - важнейший фактор, влияющий на успех приложения. Peer-компоненты AWT служат отражением этого подхода к разработке ПО. Однако Web-технология изменила взгляды пользователей.

Настраиваемый внешний вид - это гибкий механизм, предоставляющий разработчикам свободу выбора: они смогут создать интерфейс, одинаково выглядящий и работающий на всех платформах, или предусмотреть возможность выбора интерфейса для каждой конкретной платформы, чтобы создать привычную для каждого пользователя обстановку. Есть еще один вариант - когда пользователь сам выбирает вид интерфейса на свой вкус. Можно будет даже делать настраиваемый внешний вид для каждого компонента пакета приложений или Web-узла.

Буксировка

В новой версии компонентной модели JavaBeans, имеющей кодовое название "Glasgow", реализована поддержка буксировки объектов из Java-приложений в обычные и наоборот. Проект спецификации Glasgow гласит: "Поддержка буксировки реализована таким образом, что при переносе объекта из Java-приложения в обычное (и наоборот) шаг курсора мыши соответствует установленному в текущей ОС" (см. "Дополнительная информация").

Это означает, что пользователь, работающий с Java-приложением в Unix, сможет буксировать объекты в приложения Motif, а затем, запустив то же Java-приложение в Windows, будет иметь возможность обмениваться данными с OLE-приложениями. Возможность взаимодействия функции буксировки с различными ОС станет важной вехой на пути признания Java организациями (вплоть до полного перехода на Java-приложения).

Усовершенствованные функции работы с текстом

На конференции SIGS Тед Фейзон из Faison Computing продемонстрировал возможности работы с текстом, реализованные в классе JTextComponent. Он содержит набор функций, близких по мощности к SGML. JFC-приложения смогут работать с форматом rich text, который поддерживает различные шрифты, размеры, цвета и внедренные изображения. Имеются также функции, позволяющие выравнивать объекты по прямоугольной области и располагать их вокруг нее. "Благодаря функциям работы с текстом, входящим в состав JFC, Java становится в один ряд с самыми современными языками. Java-приложения смогут отображать масштабированные, усеченные или повернутые символы. Благодаря поддержке траекторий, теней, прозрачности различной степени и заливок работа с текстом почти не отличается от работы с изображениями", - сказал Фейзон.

Поддержка доступности для людей с физическими недостатками

Усилиями правительств и благодаря сложившимся рыночным условиям разработчики ПО начали осознавать важность так называемых "вспомогательных технологий". (Грубо говоря, к таковым относятся любые технологии, позволяющие человеку делать что-то, чего он без них делать не мог бы). "Java Accessibility API был разработан для того, чтобы предоставить людям с физическими недостатками доступ к миру технологий Web как дома, так и на рабочем месте, - говорит Йон Каннегаард, вице-президент JavaSoft по программным продуктам. - Разработчики получили возможность создавать приложения, которыми смогут пользоваться и инвалиды, и обычные люди" (см. "Дополнительная информация").

Переход на JFC

Хотя JFC намного объемнее и мощнее AWT, перенос старых программ осуществить не так уж сложно. Классам AWT Button, Checkbox и MenuItem соответствуют классы JFC JButton, JCheckBox и JMenuItem. Как и можно было ожидать, в JFC полностью реализованы все функции AWT, поэтому перенос сводится к изменению названий. Однако, если вы все еще пользуетесь JDK 1.0.2, вам придется перейти на событийную модель с делегированием, используемую в JDK 1.1, поскольку JFC не поддерживает старую событийную модель (см. "Дополнительная информация").

В JFC реализована архитектура под названием "Model-View-Controller" (модель -отображение - контроллер, MVC). Она была изобретена в Xerox PARC и адаптирована разработчиками Sun для JFC. "Модель" хранит данные, которые необходимо вывести. "Отображение" просматривает содержимое модели и обеспечивает вывод на экран и принтер. "Контроллер" взаимодействует с пользователем посредством отображений данных. В JFC Controller и View объединены в объект ComponentUI.

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

Программистам всегда было трудно поспеть за всеми новшествами столь быстро развивающихся платформ, какой является Java, и бета-версия Swing - не исключение. "Одно из ее слабых мест - нехватка подробной документации. То есть, она есть, но в ряде случаев в ней отсутствуют необходимые пояснения. Совсем недавно API претерпел значительные изменения, и не все из них отражены в документации. Например, не описано, как выводить на экран и уничтожать модальные диалоги. Кое-где в документации описываются несуществующие методы", - говорит Рик Фрост.

К счастью, Swing снабжен рядом работающих примеров с полным исходным текстом. В настоящее время они являются наилучшим источником практических сведений о JFC. Кроме того, Sun начала работу по созданию раздела JFC в Java Tutorial (учебнике по Java). Пока он небогат, но уже содержит сведения о компонентах button, checkbox, label, radio button, tabbed pane, table, tooltip и tree.

Об отличиях AFC и JFC

В настоящее время между Sun и Microsoft продолжается конфликт, связанный с отсутствием поддержки RMI и JNI в Internet Explorer 4.0 и изменениями, внесенными последней в библиотеки .awt, .lang и .net. Хотя Microsoft поддерживает большую часть JDK 1.1, упомянутые изменения порождают серьезную проблему для сообщества Java. Разногласия между двумя компаниями могут стать еще острее, когда разработчики Java-программ перейдут на JDK 1.2, поскольку именно JFC отличает его от предыдущей версии. В недавно опубликованной JavaWorld статье, озаглавленной "Ответы Microsoft на вопросы лобби Java", говорится: "Microsoft не поддержит JFC, но, возможно, окажет поддержку отдельным API, которые Sun будет выпускать в дальнейшем. Мы не намерены брать на вооружение все, что Sun объявляет 'стандартом'".

Microsoft выпустила свой собственный набор классов для создания пользовательских интерфейсов, Advanced Foundation Classes (AFC). Он поставляется в составе Microsoft SDK 2.01 for Java. Чтобы привлечь разработчиков на свою сторону, компания делает следующее заявление: "AFC появилась на рынке значительно раньше JFC. Разработчики получили доступ к AFC еще в начале 1997 г., и очень скоро он будет поставляться с Internet Explorer, с каждой копией Windows и, по недавно заключенному соглашению, с каждым Macintosh. Таким образом AFC окажется на подавляющем числе продаваемых компьютеров. Более того, почти все производители средств разработки объявили о намерении поддержать AFC".

На конференции SIGS Эрик Свильденс из Neuron Data представил результаты технического сравнения AFC и JFC. По его словам, у этих библиотек больше общего, чем различий. И та, и другая соответствуют архитектуре JavaBeans, обе написаны без применения peer-классов соответствуют критерию 100% Pure Java. Большинство компонентов AFC и JFC очень схожи, но в JFC есть несколько отсутствующих в AFC средств управления, а именно Rich Text и еще кое-какие для работы с мультимедиа. JFC поддерживает настраиваемый внешний вид, а AFC соответствует по этим критериям Windows (хотя разработчики смогут создать подклассы для придания своим интерфейсам произвольного внешнего вида). JFC основан на архитектуре MVC, что, вероятно, делает библиотеку пригодной для создания сложных приложений, но что несколько затрудняет ее изучение по сравнению с AFC. Кроме того, контейнерные компоненты AFC отличаются большей гибкостью, чем их аналоги из JFC.

Поскольку обе библиотеки соответствуют критерию 100% Pure Java, то теоретически, какую бы их них не выбрали разработчики, единственной издержкой для пользователя будет время загрузки (если библиотека не инсталлирована). К сожалению, не все виртуальные машины Java работают одинаково. Поэтому сейчас, принимая чисто технические решения, разработчики должны учитывать текущий ход событий и политику компаний.

Заключение

JDK версии 1.1 добавил ряд важных новшеств к платформе Java - JavaBeans, JDBC и RMI. JDK 1.2 ознаменовал своим появлением равнозначно большой скачок в функциональности Java, связанный в основном с появлением богатого набора средств создания пользовательских интерфейсов для апплетов и приложений. Разработчики JDK из Sun в очередной раз продемонстрировали стремление совершенствовать платформу и готовность реагировать на нужды сообщества разработчиков.


Джон Сандз окончил Университет Роудза в Южной Африке, получив ученую степень по специальности "Бухгалтерский учет". Последние несколько лет он работал в SunTrusty Bank, Computer Associates и Inso программистом на Visual Basic, C++ и Java. Недавно он занял должность главного инженера Dictaphone, где работает над применением криптографических технологий в записи речи. Ему можно написать по адресу john.sands@javaworld.com.

Дополнительная информациия

  • Где можно получить JFC
    http://developer.javasoft.com/developer/earlyAccess/jfc.html
  • Документация по Swing
    http://java.sun.com/products/jfc/swingdoc-current/doc/
  • Предварительная версия раздела по JFC учебника по Java
    http://java.sun.com/docs/books/tutorial/post1.0/ui/swing.html
  • Проект подсистемы буксировки для JFC
    http://java.sun.com/beans/glasgow/
  • Поддержка доступности
    http://java.sun.com/products/jfc/accessibility/doc/index.html
  • Swing и архитектура MVC
    http://java.sun.com/products/jfc/swingdoc-current/doc/mvc.html
  • 2D API
    http://java.sun.com/products/java-media/2D/index.html
  • Бета-версия Microsoft SDK 2.01 for Java
    http://www.microsoft.com/java/download.htm
  • Вопросы и ответы о поддержке различных Java-технологий компанией Microsoft
    http://www.microsoft.com/java/issues/techsupfaq.htm
  • Использование событийной модели для создания AWT-компонентов
    http://www.javaworld.com/javaworld/jw-05-1997/jw-05-step.html