Java-приложения становятся "органичными" по внешнему виду и приобретают кросс-платформенные свойства

Как вы, вероятно, уже знаете, в конце февраля вышла группа компонентов Swing 1.0, разработанная компанией JavaSoft. Компоненты Swing представляют собой расширение библиотеки Lightweight UI Framework, которая, в свою очередь, после выхода JDK 1.1 стала частью Java AWT (Abstract Windowing Toolkit). Одной из наиболее важных особенностей набора компонентов Swing, который полностью войдет в состав Java 1.2, является архитектура настраиваемого внешнего вида и поведения (look and feel, L&F), позволяющая выбирать для создаваемого приложения один из готовых шаблонов L&F и определять собственный внешний вид и поведение элементов управления.

ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ SWING

Предварительная версия Swing, анонсированная в 1997 году на конференции JavaOne и ставшая доступной для разработчиков с июля прошлого года, содержит три шаблона L&F:

  • Java (исходный кросс-платформенный L&F)
  • L&F в стиле Motif
  • L&F в стиле Windows 32

    В версии 1.0 пакета Swing L&F Java был переименован в Organic. Кроме того, в нем появились две новые цветовые схемы - Santa Fe и Vancouver. Пользователям предварительной версии, применявшим L&F Java, придется заменить в исходном тексте команды JLFLookAndFeel на OrganicLookAndFeel.

    Picture Picture
    L&F Organic, цветовая схема Santa Fe L&F Organic, цветовая схема Vancouver
    Picture Picture
    L&F в стиле Motif L&F в стиле Win32

    Рис. 1. Цветовые схемы, принятые в Swing

    Идя навстречу пожеланиям пользователей предварительных версий Swing, разработчики внесли много улучшений в L&F Java. Ниже приводится список изменений, произошедших в L&F Organic (бывший Java).

  • Цветовые схемы. Учитывая требования участников бета-тестирования, разработчики Swing добавили в L&F Organic цветовую схему земельных тонов Santa Fe и схему серых тонов Vancouver. Информация о цветовой схеме, используемой в текущем интерфейсе, инкапсулирована в объекте Theme. Цветовая схема устанавливается с помощью метода setCurrentTheme(). В последующих версиях Swing объект Theme будет отвечать не только за цветовые схемы.

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

  • Комбинированные списки (Combo boxes). Комбинированные списки сохранили свой прежний вид, но теперь сюда можно добавлять индикаторы возможности модификации их содержимого.

  • Полосы прокрутки и другие компоненты. Поскольку мнения специалистов относительно прокрутки разделились, решено пока оставить полосы прокрутки такими как есть. Компоненты radioButtonMenuItems и checkBoxMenuItems подверглись усовершенствованию. Скользящие рычажки (sliders) теперь могут быть закрашенными или незакрашенными.

    L&F Motif и Windows 32 в точности скопированы с оригиналов. В последнем имеется блокирующий метод, предотвращающий запуск интерфейсов на отличных от Windows платформах: JavaSoft не получила от Microsoft права предлагать L&F в стиле Windows пользователям других платформ.

    SWING 1.0 ОБРЕЛ НОВЫЙ ВНЕШНИЙ ВИД (ПО СУТИ, ЦЕЛЫХ ДВА)

    JavaSoft планирует создать еще два L&F для Swing 1.0. Авторы Symantec Visual Cafe и инженеры Apple помогли JavaSoft разработать L&F в стиле Macintosh. Кроме того, JavaSoft выпустила новый кросс-платформенный L&F, устанавливаемый по умолчанию. Он называется Metal.

    Picture Picture
    L&F в стиле Macintosh L&F Metal (выбирается по умолчанию)

    Рис. 2. Новые L&F, реализованные в Swing 1.0

    Многие разработчики жаловались на чрезмерную "выпуклость" объемных элементов интерфейса, особенно клавиш и инструментальных линеек. При создании L&F Metal эти жалобы были учтены - бросающиеся в глаза "выступы" устранены, но некоторая объемность, необходимая для разграничения состояния объектов, сохранена.

    Picture_3
    Рис. 3. Традиционный объемный вид компонентов и новый, в стиле "гравюры на металле", реализованный в L&F Metal

    Цветовая схема L&F Metal проще, чем у L&F, который выбирался по умолчанию в предварительной версии Swing. Это сделано с тем, чтобы при переносе с платформы на платформу не возникало проблем с цветовыми палитрами. Более подробную информацию о L&F Metal можно получить на Web-узле Sun (см. врезку "Ресурсы".)

    По словам представителей JavaSoft, L&F Macintosh появится вскоре после выхода Swing 1.0. Кроме того, после замены L&F, выбираемого по умолчанию, L&F Organic в комплект Swing 1.0 не включен, хотя и доступен для загрузки по Internet.

    МЕСТО SWING В JFC

    Компоненты Swing поддерживают событийную модель JavaBeans, то есть могут функционировать независимо от Swing в приложениях и средах разработки, совместимых с архитектурой JavaBeans. В JDK 1.1 (и выше) Swing представляет собой один из пяти API, составляющих Java Foundation Classes (JFC). Ниже перечислены остальные четыре.

  • Abstract Windowing Toolkit (AWT) - набор средств для разработки графических интерфейсов, составляющий основу многих классов Swing.

  • Java 2D - библиотека классов, содержащая набор развитых функций для работы с двумерной графикой; этот API основан на технологии, разработанной компаниями IBM и Taligent.

  • Accessibility API - набор технологий, позволяющих людям с различными физическими недостатками использовать компоненты JFC и AWT. В состав этой библиотеки входят функции увеличения участков экрана и механизмы голосового воспроизведения экранного текста.

  • Drag-and-drop - технология, обеспечивающая возможность обмена данными между Java-приложениями, между Java- и платформенно-зависимыми приложениями, а также между компонентами одного и того же Java-приложения.

    КЛАССЫ КОМПОНЕНТОВ SWING

    Swing реализован посредством трех составляющих JFC, к которым относятся:

  • Классы пользовательских интерфейсов (UI) - набор компонентов, являющихся дочерними объектами JComponent (родителем которого, в свою очередь, является класс AWT Container). Компоненты Swing могут содержать другие компоненты, то есть имеется возможность создания вложенных структур.

  • Классы, не относящиеся к UI (1), - классы поддержки, которые не создают экранные компоненты, но реализуют различные функции API Swing.

  • Классы, не относящиеся к UI (2), - интерфейсы, используемые классами компонентов и классами поддержки Swing.

    Классы UI отвечают за настраиваемый L&F, за возможность расширения компонентов, перехват ввода с клавиатуры, настройку обрамления компонентов, поддержку кратких описаний инструментов (небольших всплывающих подсказок), автоматическую прокрутку, поддержку отладки и локализации.

    С помощью "приспособлений" (widgets) Swing можно точно задавать внешний вид пользовательского интерфейса в соответствии с выбранной платформой. Компоненты Swing работают поверх API Java 2D, Accessibility и Drag-and-drop.

    Многие компоненты Swing являются чистыми Java-версиями таких объектов AWT, как Button, Scrollbar и т. д. Кроме того, в Swing включены компоненты более высокого уровня, отсутствующие в API AWT, например дерево объектов, окно-список, панель с ярлыками.

    Кроме готовых L&F, о которых говорилось выше, Swing предоставляет набор средств, позволяющий приложениям автоматически реализовывать заказные L&F на любой операционной системе. Этот набор представляет собой обширную библиотеку, содержащую более 250 классов (вдвое больше, чем в AWT) и более 75 интерфейсов, предназначенных для создания облегченных компонентов Java GUI.

    ПАКЕТЫ SWING

    Интерфейсы и классы Swing объединены в пакеты. Ниже приводятся как готовые, так и разрабатываемые в настоящее время пакеты Swing 1.0.

  • Пакет Accessibility определяет взаимодействие между объектами UI (например, системами голосового воспроизведения экранного текста, терминалами Брайля и пр.) и устройствами доступа к экранной информации, используемыми людьми с физическими недостатками.
  • Самый крупный пакет Swing Component реализует все классы компонентов, используемые в Swing (за исключением JTableHeader и JTextComponent). Классы UI (их названия начинаются с "J") применяются для реализации компонентов; классы, не относящиеся к UI, служат для поддержки функций приложений и компонентов.
  • Пакет Basic, несколько уступающий предыдущему по объему, распознает устанавливаемые по умолчанию характеристики внешнего вида компонентов Swing.
  • Пакет Beaninfo определяет класс SwingBeanInfo, содержащий оригиналы методов getIcon() и getDefaultIPropertyIndex(). Этот класс содержит и оригиналы служебных методов, в частности метода createPropertyDescriptor, позволяющего создавать реализации BeanInfo.
  • Пакет Border состоит из одного интерфейса и девяти классов, которые можно делить на подклассы, если нужно создать особое обрамление для какого-либо компонента.
  • Пакет Event определяет классы событий, характерных для Swing, аналогично пакету java.awt.event. Этот пакет особенно необходим, если надо создать компонент для слежения за работой других компонентов.
  • Пакет Multi содержит классы Multiplexing UI, позволяющие объединять компоненты, созданные с помощью различных средств разработки пользовательских интерфейсов.
  • Пакет Pluggable L&F обеспечивает возможность настройки L&F.
  • Пакет Preview содержит компоненты JColorChooser и JFileChooser.
  • Пакет Table имеет ряд низкоуровневых классов для работы с таблицами.
  • Пакет Text располагает классами и интерфейсами для работы с текстовыми компонентами.
  • В пакет HTML входит класс HTMLEditorKit, реализующий простой текстовый редактор файлов в формате HTML.
  • Пакет RTF реализует простой текстовый редактор файлов в формате RTF (Rich Text Format).
  • Пакет Tree содержит классы, используемые для создания деревьев, их вывода на экран и управления ими.
  • В пакет Undo включены классы и методы, предназначенные для реализации функции отмены операций.

    НОВОЕ В SWING 1.0

    Как и было обещано, в Swing 1.0 войдет ряд новых и улучшенных функций. Рассмотрим наиболее важные из них.

    Из API JTable изъят класс DefaultCellRenderer, служивший универсальным механизмом вывода для классов JList, JTree и JTable. Теперь каждый из этих классов обрел свой собственный механизм вывода.

    В классе JTabbedPane появилось новое свойство - tabPlaсement, указывающее, с какой стороны панели размещать ярлыки - слева, справа, сверху или снизу. Кроме того, появились два метода, позволяющие блокировать выбор ярлыка, несколько методов для назначения цвета ярлыков, метод, возвращающий текущие размеры каждого ярлыка, и метод, возвращающий текущее число отображаемых ярлыков.

    Из класса JComponent исчезли методы getClientProperties() и setClientProperties(). Вместо них введен метод clientProperty.

    Класс JDialog ранее служил средством использования "ложной модальности" классов диалогов, главная задача которого - преодоление ограничения AWT 1.1, делавшего невозможным использование окон, порожденных объектами Dialog. Это означало, что компоненты, создававшие объекты Windows (в частности, JPopupMenu и JComboBox), не работали при помещении их в модальные диалоги - отсутствовала возможность ввода данных. Что, в свою очередь, препятствовало вводу данных в другие окна, вызывая сообщения об ошибках доступа к очереди системных событий. В Swing 1.0 класс JDialog модифицирован таким образом, чтобы можно было использовать истинную модальность AWT. Кроме того, при помещении в модальные диалоги компоненты Swing 1.0 всегда используют "облегченные" (lightweight) выпадающие окна.

    КОНЦЕПЦИЯ, ЛЕЖАЩАЯ В ОСНОВЕ SWING

    Чтобы понять, в каком направлении пойдет развитие Swing, следует обратиться к концепции, которой руководствуются его разработчики. При разработке, модификации и обновлении Swing его создатели придерживаются следующего набора правил.

    1. Внешний вид должен быть уникальным, но не за счет использования логотипов.

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

    3. Акцент следует делать на содержании, а не на количестве компонентов.

    4. Необходимо избавляться от излишней вычурности пользовательских интерфейсов, соблюдать в них порядок.

    5. Обязательно исправлять ошибки в уже существующих компонентах.


    Кейн Скарлетт пишет статьи для JavaWorld и NC World, и является исполнительным редактором последнего. Ему можно написать по адресу kane.scarlett@javaworld.com.

    Ресурсы

  • Что такое Swing?
    http://java.sun.com/products/jfc/swingdoc-current/intro.html
  • Набор инструментов Swing
    http://java.sun.com/products/jfc/swingdoc-current/tool_set.html
  • Электронный бюллетень Swing Collection
    http://java.sun.com/products/jfc/swingdoc-current/
  • Отличительные черты L&F Metal
    http://java.sun.com/products/jfc/swingdoc-current/chris_ryan/metal.html