Набор инструментов абстрактного окна
Abstract Window Toolkit ( AWT ) — это набор оригинальный платформо-зависимый инструментов для работы с окнами , графикой и пользовательского интерфейса виджетами , предшествовавший Swing . AWT является частью Java Foundation Classes (JFC) — стандартного API для предоставления графического пользовательского интерфейса (GUI) для программы Java. AWT также представляет собой набор инструментов с графическим интерфейсом для ряда профилей Java ME . Например, для профилей конфигурации подключенных устройств требуются среды выполнения Java на мобильных телефонах для поддержки набора средств Abstract Window Toolkit.
История
[ редактировать ]Когда Sun Microsystems впервые выпустила Java в 1995 году, виджеты AWT обеспечивали тонкий уровень абстракции над базовым собственным пользовательским интерфейсом. Например, создание флажка AWT приведет к тому, что AWT напрямую вызовет базовую собственную подпрограмму, создавшую флажок. Однако флажок в Windows отличается от флажка в macOS или различных типах Unix . Некоторые разработчики приложений предпочитают эту модель, поскольку она обеспечивает высокую степень точности базового встроенного набора оконных инструментов и бесшовную интеграцию с собственными приложениями. Другими словами, программа с графическим интерфейсом, написанная с использованием AWT, при запуске в Windows выглядит как собственное приложение Microsoft Windows, но та же программа выглядит как собственное приложение Apple Macintosh при запуске на Mac и т. д. Однако некоторым разработчикам приложений эта модель не нравится, потому что они предпочитают, чтобы их приложения выглядели одинаково на каждой платформе.
В J2SE 1.2 инструментарий Swing в значительной степени заменил виджеты AWT. Помимо предоставления более богатого набора виджетов пользовательского интерфейса, Swing рисует свои собственные виджеты (используя Java 2D для вызова подпрограмм низкого уровня в локальной графической подсистеме) вместо того, чтобы полагаться на модуль пользовательского интерфейса операционной системы высокого уровня. Swing предоставляет возможность использовать либо «внешний вид» собственной платформы , либо кросс-платформенный внешний вид («Внешний вид Java»), который выглядит одинаково во всех оконных системах.
Архитектура
[ редактировать ]AWT предоставляет два уровня API :
- Общий интерфейс между Java и собственной системой, используемый для управления окнами , событиями и менеджерами макетов . Этот API лежит в основе программирования Java GUI , а также используется в Swing и Java 2D . Он содержит:
- Интерфейс между собственной оконной системой и приложением Java;
- Ядро подсистемы событий графического интерфейса ;
- Несколько менеджеров по расположению ;
- Интерфейс для устройств ввода, таких как мышь и клавиатура ; и
- А
java.awt.datatransfer
пакет для использования с буфером обмена и функцией перетаскивания .
- Базовый набор виджетов графического интерфейса, таких как кнопки, текстовые поля и меню. Он также предоставляет собственный интерфейс AWT , который позволяет отображать рендеринга, библиотеки скомпилированные в собственный код, для рисования непосредственно в AWT.
Canvas
Поверхность рисования объекта .
AWT также предоставляет приложениям некоторые функции более высокого уровня, такие как:
- Доступ к системному трею на поддерживающих системах; и
- Возможность запуска некоторых настольных приложений, таких как веб-браузеры и почтовые клиенты, из приложения Java.
Ни AWT, ни Swing по своей сути не являются потокобезопасными . Поэтому код, который обновляет графический интерфейс или обрабатывает события, должен выполняться в потоке диспетчеризации событий . Несоблюдение этого требования может привести к взаимоблокировке или гонке. Чтобы решить эту проблему, служебный класс под названием SwingWorker позволяет приложениям выполнять трудоемкие задачи после событий взаимодействия с пользователем в потоке диспетчеризации событий.
Смешивание компонентов AWT и Swing
[ редактировать ]Если существует версия компонента AWT в формате Swing, она будет начинаться с J- и должна использоваться исключительно вместо версии AWT. Например, в Swing используйте только JButton, а не класс Button. Как упоминалось выше, основные классы AWT, такие как Color и Font, по-прежнему используются в Swing как есть.
При рисовании в Swing используйте JPanel и переопределите PaintComponent(Graphics g) вместо использования методов Paint() AWT.
До Java 6 Update 12 смешивание компонентов Swing и базовых виджетов AWT часто приводило к нежелательным побочным эффектам: виджеты AWT появлялись поверх виджетов Swing независимо от их определенного z-порядка . Эта проблема заключалась в том, что архитектура рендеринга двух наборов инструментов виджетов сильно отличалась, несмотря на то, что Swing заимствовал тяжелые верхние контейнеры у AWT. [ 1 ]
Начиная с версии Java 6 Update 12 , можно смешивать виджеты Swing и AWT без проблем с z-порядком. [ 2 ]
Пример
[ редактировать ]import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyApp {
public static void main(char[] args) {
Frame frame = new Frame("Application");
frame.add(new Label("Hello!"));
frame.setSize(500, 500);
frame.setLocationRelativeTo(null); // Centers the window
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose(); // Releases native screen resources
}
});
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 для Качокавалло [ 7 ] находится в стадии разработки, как и серверная часть HTML5 ; цель состоит в том, чтобы развернуть существующие приложения Swing (без поддержки Java) как обычные веб-приложения, работающие на веб-сервере. [ 7 ] [ 8 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Фаулер, Эми (1994). «Смешивание тяжелых и легких компонентов» . Сан Микросистемс . Архивировано из оригинала 23 декабря 2011 года . Проверено 17 декабря 2008 г.
- ^ «Ошибка/RFE исправлена в текущей сборке JDK 6u12» . Сан Микросистемс . 12 декабря 2008 г. Архивировано из оригинала 17 декабря 2008 г. Проверено 17 декабря 2008 г.
- ^ Торре, Марио (2 марта 2008 г.). «ОКОНЧАТЕЛЬНОЕ ПРЕДЛОЖЕНИЕ: Портативные интерфейсы с графическим интерфейсом» . Архивировано из оригинала 19 марта 2012 года . Проверено 7 сентября 2008 г.
- ^ Кеннке, Роман (18 декабря 2008 г.). «Обзор архитектуры Качокавалло» . Проверено 7 сентября 2008 г.
- ^ Кеннке, Роман (3 сентября 2008 г.). «Сверстники Cacio Swing AWT» . Архивировано из оригинала 13 марта 2012 года . Проверено 7 сентября 2008 г.
- ^ «Сколько было выдвинуто вверх по течению?» . openjdk.java.net. 20 сентября 2009 г. Архивировано из оригинала 19 марта 2012 г. Проверено 7 марта 2010 г.
Вам больше не нужны эти патчи: с последней версией FontManager все теперь в исходном коде, поэтому просто используйте репозиторий Cacio, он полностью автономен.
- ^ Jump up to: а б Кеннке, Роман (28 июля 2011 г.). «JDK7 и крутость Качио» . Проверено 8 августа 2011 г.
- ^ Эйссерер, Клеменс. «HTML5/Canvas серверная часть для Качокавалло (GNU-Classpath)» . Архивировано из оригинала 21 марта 2012 года . Проверено 8 августа 2011 г.