Abstract Window Toolkit
Abstract Window Toolkit (AWT) — это исходная платформо-независимая оконная библиотека графического интерфейса (Widget toolkit) языка Java. Сейчас AWT является частью Java Foundation Classes (JFC) — стандартного API для реализации графического интерфейса в Java-программе.
Также AWT является стандартной библиотекой GUI для некоторых профилей Java ME. Например, профили Connected Device Configuration требуют от среды исполнения Java на мобильных телефонах поддержки AWT.
История
Когда Sun Microsystems впервые выпустила Java в 1995 году, виджеты AWT предоставляли тонкий уровень абстракции над основным родным пользовательским интерфейсом. Например, создание флажка AWT заставляет AWT напрямую вызвать более низкоуровневую нативную подпрограмму, которая и создает флажок. Однако, флажок (check box) на Microsoft Windows - это не совсем то же, что флажок на Mac OS или на различных видах Unix. Некоторые разработчики предпочитают эту модель, поскольку она обеспечивает высокую степень соответствия основному оконному инструментарию и беспрепятственную интеграцию с родными приложениями. Другими словами, GUI-программа, написанная с использованием AWT, выглядит как родное приложение Microsoft Windows, будучи запущенной на Windows, и в то же время - как родное приложение Apple Macintosh, будучи запущенной на Mac, и т. д. Однако, некоторым разработчикам не нравится эта модель, потому что они предпочитают, чтобы их приложения выглядели одинаково на всех платформах.
В J2SE 1.2 виджеты AWT были в значительной степени заменены аналогичными из Swing. В дополнение к предоставлению более богатого набора элементов интерфейса пользователя, Swing рисует свои собственные виджеты (с помощью Java 2D для вызова низкоуровневых подпрограмм местной графической подсистемы) вместо того, чтобы полагаться на высокоуровневый модуль пользовательского интерфейса операционной системы. Swing обеспечивает возможность использования либо системного «look and feel», который использует родной «look and feel» платформы, либо кросс-платформенный внешний вид («Java Look and Feel»), который выглядят одинаково на всех платформах. Тем не менее, Swing использует AWT для взаимодействия с родной оконной системой.
Архитектура
AWT предоставляет два уровня API:
- Общий интерфейс между Java и родной системой, используемый для управления окнами, событиями, менеджерами компоновки. Этот API является основой программирования Java GUI и используется также Swing и Java 2D. Он содержит:
- Интерфейс между родной оконной системой и Java-приложением;
- Ядро обработчика событий интерфейса;
- Некоторые менеджеры компоновки;
- Интерфейс к устройствам ввода, таким, как мышь и клавиатура; и
- Пакет
java.awt.datatransfer
для использования с буфером обмена и Drag and Drop.
- Базовый набор виджетов графического интерфейса, таких, как кнопки, текстовые поля (text box) и меню. Она также предоставляет AWT Native Interface, который позволяет библиотекам в нативном коде рисовать непосредственно на
Canvas
.
AWT также предоставляет приложениям некоторую высокоуровневую функциональность:
- Доступ к области уведомлений на поддерживаемых системах; и
- Возможность запуска некоторых десктопных приложений, таких, как веб-браузеры и почтовые клиенты из Java-приложения.
Ни AWT, ни Swing не являются по своей природе потокобезопасными. Таким образом, код, обновляющий GUI или обрабатывающий события, должен выполняться в потоке диспетчеризации событий (англ. event dispatching thread, EDT). Невыполнение этого требования может привести к взаимной блокировке или состязанию. Для решения этой проблемы служебный класс SwingWorker
позволяет приложениям выполнять «тяжёлые» обработчики интерфейсных событий в потоке обработки событий.
Смешивание компонентов AWT и Swing
Начиная с Java 6#Java SE 6 Update 10 смешивание компонентов Swing и основных виджетов AWT часто приводило к нежелательным побочным эффектам, с появлением AWT-виджетов над виджетами Swing, независимо от их определенного порядка наложения. Эта проблема объясняется тем, что архитектура рендеринга двух widget toolkits очень разная, несмотря на заимствование Swing’ом тяжеловесных контейнеров верхнего уровня из AWT[1].
Начиная с Java 6#Java SE 6 Update 12 стало возможно смешивать виджеты Swing и AWT без проблем с порядком наложения.
Реализация
Так как AWT является мостом к нижележащему нативному пользовательскому интерфейсу, его реализация на новой операционной системе может быть большой работой, главным образом для набора виджетов, которые требуют разработки с нуля нативных peers для каждого из виджетов AWT.
Одновременно с разработкой Java начал разрабатываться проект Caciocavallo. Его целью является предоставление Java API, основанных на OpenJDK для облегчения написания реализаций AWT для новых операционных систем[2]. Для построения интерфейса используется Java2D[3]. Все необходимые модификации включены в JDK начиная с версии OpenJDK 7[4].
См. также
- Викикнига об AWT
- Event dispatching thread
- AWT Native Interface (JAWT)
- Swing
- Standard Widget Toolkit
- SwingWorker
Примечания
- Fowler, Amy Mixing heavy and light components (недоступная ссылка). Sun Microsystems (1994). Дата обращения: 17 декабря 2008. Архивировано 1 мая 2012 года.
- Torre, Mario FINAL PROPOSAL: Portable GUI backends (недоступная ссылка) (2 марта 2008). Дата обращения: 7 сентября 2008. Архивировано 1 мая 2012 года.
- Kennke, Roman Cacio Swing AWT peers (3 сентября 2008). Дата обращения: 21 апреля 2013. Архивировано 29 апреля 2013 года.
- How much has been pushed upstream? (недоступная ссылка). openjdk.java.net (20 сентября 2009). — «You don't need anymore those patches, with the latest FontManager push, everything is upstream now, so just use the Cacio repo, it's completely self contained.». Дата обращения: 7 марта 2010. Архивировано 1 мая 2012 года.
Ссылки
- AWT homepage
java.awt
(AWT Javadoc API documentation)