Abstract Window Toolkit ( AWT ) — это оригинальный платформенно-зависимый набор инструментов для создания окон , графики и виджетов пользовательского интерфейса Java , предшествующий Swing . AWT является частью Java Foundation Classes (JFC) — стандартного API для предоставления графического пользовательского интерфейса (GUI) для программы Java. AWT также является набором инструментов GUI для ряда профилей Java ME . Например, профили конфигурации подключенных устройств требуют, чтобы среды выполнения Java на мобильных телефонах поддерживали Abstract Window Toolkit.
Когда Sun Microsystems впервые выпустила Java в 1995 году, виджеты AWT обеспечивали тонкий уровень абстракции над базовым собственным пользовательским интерфейсом. Например, создание флажка AWT заставляло AWT напрямую вызывать базовую собственную подпрограмму, которая создавала флажок. Однако флажок в Windows — это не то же самое, что флажок в macOS или в различных типах Unix . Некоторые разработчики приложений предпочитают эту модель, поскольку она обеспечивает высокую степень точности базового собственного инструментария окон и бесшовную интеграцию с собственными приложениями. Другими словами, программа с графическим интерфейсом, написанная с использованием AWT, выглядит как собственное приложение Microsoft Windows при запуске в Windows, но та же программа выглядит как собственное приложение Apple Macintosh при запуске на Mac и т. д. Однако некоторым разработчикам приложений эта модель не нравится, поскольку они предпочитают, чтобы их приложения выглядели одинаково на каждой платформе.
В J2SE 1.2 инструментарий Swing в значительной степени заменил виджеты AWT. Помимо предоставления более богатого набора виджетов пользовательского интерфейса, Swing рисует собственные виджеты (используя Java 2D для вызова низкоуровневых подпрограмм в локальной графической подсистеме) вместо того, чтобы полагаться на высокоуровневый модуль пользовательского интерфейса операционной системы. Swing предоставляет возможность использовать либо собственный "образ и поведение" платформы , либо кроссплатформенный вид и поведение ("Java Look and Feel"), который выглядит одинаково во всех оконных системах.
AWT предоставляет два уровня API :
java.awt.datatransfer
буфером обмена и функцией перетаскивания .Canvas
объектов AWT .AWT также предоставляет приложениям некоторые функции более высокого уровня, такие как:
Ни AWT, ни Swing не являются изначально потокобезопасными . Поэтому код, который обновляет GUI или обрабатывает события, должен выполняться в потоке диспетчеризации событий . Невыполнение этого требования может привести к взаимоблокировке или состоянию гонки. Для решения этой проблемы служебный класс SwingWorker позволяет приложениям выполнять трудоемкие задачи после событий взаимодействия с пользователем в потоке диспетчеризации событий.
Если есть версия Swing компонента AWT, она будет начинаться с J- и должна использоваться исключительно, заменяя версию AWT. Например, в Swing используйте только JButton, а не класс Button. Как упоминалось выше, основные классы AWT, такие как Color и Font, по-прежнему используются в Swing как есть.
При рисовании в Swing используйте JPanel и переопределите paintComponent(Graphics g) вместо использования методов AWT paint().
До Java 6 Update 12 смешивание компонентов Swing и базовых виджетов AWT часто приводило к нежелательным побочным эффектам, когда виджеты AWT появлялись поверх виджетов Swing независимо от их определенного z-порядка . Эта проблема была связана с тем, что архитектура рендеринга двух наборов инструментов виджетов сильно различалась, несмотря на то, что Swing заимствовал тяжеловесные верхние контейнеры из AWT. [1]
Начиная с Java 6 Update 12 , стало возможным смешивать виджеты Swing и AWT без возникновения проблем с z-порядком. [2]
импорт java.awt.* ; импорт java.awt.event.WindowAdapter ; импорт java.awt.event.WindowEvent ; публичный класс MyApp { public static void main ( char [] args ) { Frame frame = new Frame ( "Application" ); frame . add ( new Label ( "Hello!" )); frame . setSize ( 500 , 500 ); frame . setLocationRelativeTo ( null ); // Центрирует рамку окна . addWindowListener ( new WindowAdapter () { @Override public void windowClosing ( WindowEvent e ) { frame . dispose (); // Освобождает собственные ресурсы экрана } }); frame . setVisible ( true ); } }
Поскольку AWT является мостом к базовому нативному пользовательскому интерфейсу, его реализация в новой операционной системе может потребовать много работы, особенно если она включает в себя какие-либо виджеты графического интерфейса AWT, поскольку каждый из них требует разработки своих нативных аналогов с нуля.
Был создан новый проект Caciocavallo, который предоставляет API Java на основе OpenJDK для упрощения внедрения AWT в новых системах. [3] [4] Проект успешно внедрил виджеты AWT с использованием Java2D . [5] Все необходимые модификации ядра JDK с тех пор были перенесены в OpenJDK 7 , [6] что означает, что Java теперь можно использовать на графическом стеке, отличном от того, который предоставляется официальным JDK ( X Window System , OpenGL или DirectX ), путем включения внешней библиотеки и установки некоторых системных свойств. DirectFB- бэкэнд для Caciocavallo [7] находится в стадии разработки, как и HTML5 -бэкэнд; цель состоит в том, чтобы развернуть существующие приложения Swing — без поддержки Java — как обычные веб-приложения, работающие на веб-сервере. [7] [8]
Вам больше не нужны эти патчи, с последним релизом FontManager все теперь загружено в апстрим, так что просто используйте репозиторий Cacio, он полностью автономен.
java.awt
( документация API AWT Javadoc )