вполне заслуживают названия об®ектов, как бы это слово ни пони-
малось. Иначе говоря, вполне понятно, что такое "кнопка вооб-
ще", "список вообще" и т.д.
Все это дает основания надеяться, что с помощью об®ектно-ориен-
тированного подхода можно получить по-настоящему высокоуровне-
вую и переносимую оконную среду, основанную на абстрактных ти-
пах данных.
Данная особенность оконных сред проявилась, в частности, в по-
явлении довольно большого количества различных классовых библи-
отек, "обертывающих" оригинальные оконные системы. В качестве
примеров можно привести MFC, OWL, Zink и многие другие.
Вот и среди стандартных Java-библиотек присутствует AWT или
Abstract Windowing Toolkit - абстрактный оконный инструмента-
рий.
AWT является системой классов для поддержки программирования в
оконной среде. Его "абстрактность" проявляется в том, что все,
зависящее от конкретной платформы, хорошо локализовано и спря-
тано. В AWT реализованы такие простые и понятные вещи, как
кнопки, меню, поля ввода; простые и понятные средства организа-
ции интерфейса - контейнеры, панели, менеджеры геометрии. Это
хорошо видно на рис. x1.
Рис. x1. Основные элементы иерархии классов AWT.
Все зависимости от платформы содержатся в ветви, обозначенной
как Peer.
Далее мы рассмотрим некоторые особенности AWT, не претендуя на
полноту изложения. Наша цель - дать общее ппредставление о тех-
нологии программирования графического оконного интерфейса в
среде Java.
4.3.2. Из чего строится графический интерфейс (компоненты и
контейнеры)
Если посмотреть на любое оконное приложение, то легко увидеть,
что интерфейсная часть состоит из об®ектов, об®единенных в
группы. В AWT об®екты называются компонентами (на самом деле
они все являются наследниками класса Component), а группы об-
®ектов реализованы с помощью так называемых контейнеров. Отме-
тим, что любой контейнер - это тоже компонента, поэтому группы
об®ектов могут быть вложены друг в друга. Как обычно, меню сто-
ят особняком. Иерархия компонент показана на рис. x2. (Автором
этого и двух следующих рисунков является Charles L. Perkins,
clp@home.HarvardSq.com.)
Рис. x2. Иерархия компонент AWT
На рис. x3 поясняются обозначения, использованные на рис. x2.
К числу примитивных компонент относятся:
- Button
- Checkbox
- Label
- List
- ScrollBar
- TextArea
- TextField
Основные контейнеры:
- Dialog
- FileDialog
- Frame
- Panel
- Window
Взаимодействие интерфейсных компонент с пользователем реализо-
вано с помощью аппарата событий, о котором будет рассказано ни-
же.
4.3.3. Как организовать интерфейс
Мы уже отмечали, что интерфейс состоит из компонент, помещенных
в контейнеры. Однако, остается открытым вопрос о том, как раз-
мещать компоненты друг относительно друга внутри контейнера.
Наивный подход (принятый, тем не менее, во многих системах)
заключается в задании относительных координат компонент в кон-
тейнере. Вариации этого подхода состоят, как правило, в возмож-
ности задавать различные единицы длины (пикселы, тысячные дюй-
ма, "диалоговые единицы"). Недостатком подобной модели размеще-
ния компонент является то, что при переводе приложения на дру-
гую платформу и даже на другой компьютер, внешний вид приложе-
ния меняется плохо предсказуемо.
AWT старается решить данную проблему следующим образом. Если
нельзя избежать изменений внешнего вида приложений при запуске
их на разных платформах, надо постараться хотя бы сделать эти
изменения предсказуемыми и в некотором смысле естественными.
Для проведения этой программы в жизнь используются об®екты под
общим названием Layout (расположение). Layout управляет тем,
как компоненты будут располагаться внутри контейнера, следуя
определенным принципам или рецептам.
Всего в AWT имеется 5 предопределенных расположений:
- BorderLayout
- CardLayout
- FlowLayout
- GridLayout
- GridBagLayout
Их местоположение в иерархии классов показано на рис. x4.
Рис. x4. Расположения и иерархия классов AWT.
Расположения являются прямыми наследниками класса Object и все
реализуют протокол LayoutManager.
Об®ект типа LayoutManager содержится в классе Container. В
классе Container определены 3 метода add, предназначенные для
добавления новых компонент в контейнер. Куда именно будет до-
бавлена компонента с помощью метода add, зависит от конкретного
типа LayoutManager данного контейнера. Для задания
Читать дальше