Понятие и значение апплетов в функционировании программы. Передача параметров и формирование контекста, порядок инициализации, перерисовка, принципы задания размеров графических объектов. Использование и позиционирование шрифтов. Менеджеры компоновки.
2. Апплеты............................................................................................................................2 2.1. Тег HTML .................................................................................................3 2.2. Передача параметров............................................................................................5 2.3. Контекст апплета....................................................................................................5 2.4. Отладочная печать.................................................................................................5 2.5. Порядок инициализации апплета..........................................................................6 2.6. Перерисовка............................................................................................................7 2.7. Задание размеров графических изображений.....................................................7 2.8. Простые методы класса Graphics......................................................................... 7
2.9. Цвет.........................................................................................................................8 2.9.1. Методы класса Color..................................................................................... 9
2.10. Шрифты.................................................................................................................9 2.10.1. Использование шрифтов..........................................................................10 2.10.2. Позиционирование и шрифты: FONTMETRICS............................................. 11 2.10.3. Использование FONTMETRICS.......................................................................11 2.10.4. Центрирование текста...............................................................................12
8. Обработка событий.......................................................................................................28 8.1. Рисование "каракулей" в Java.............................................................................32 8.2. Рисование "каракулей" с использованием встроенных классов......................33
2. Апплеты...........................................................................................................................2 2.1. Тег HTML .......................................................................................................3 2.2. Передача параметров..................................................................................................5 2.3. Контекст апплета..........................................................................................................5 2.4. Отладочная печать.......................................................................................................5 2.5. Порядок инициализации апплета................................................................................6 2.6. Перерисовка................................................................................................................. 7 2.7. Задание размеров графических изображений...........................................................7 2.8. Простые методы класса Graphics...............................................................................7
2.9. Цвет...............................................................................................................................8 2.9.1. Методы класса Color...........................................................................................9
2.10. Шрифты.......................................................................................................................9 2.10.1. Использование шрифтов................................................................................10 2.10.2. Позиционирование и шрифты: FONTMETRICS................................................... 11 2.10.3. Использование FONTMETRICS.............................................................................11 2.10.4. Центрирование текста.....................................................................................12
Трудность при создании независимой от платформы библиотеки заключается в том, что ее разработчикам либо приходится требовать, чтобы все приложения на всех платформах вели себя и выглядели одинаково, либо для поддержки, скажем, трех различных разновидностей интерфейса приходится писать в три раза больше кода. Существуют два взгляда на эту проблему. Один подход заключается в том, что упор делается на графику низкого уровня - рисование пикселей, при этом разработчики библиотеки сами заботятся о внешнем виде каждого компонента. При другом подходе создаются абстракции, подходящие для библиотек каждой из операционных систем, и именно "родные" пакеты данной операционной системы служат подъемной силой для архитектурно-нейтральной библиотеки на каждой из платформ. В Java при создании библиотеки Abstraction Window Toolkit (AWT) выбран второй подход.
Начнем изучение AWT с апплетов.
2. Апплеты
Апплеты (applets) - это маленькие приложения, которые размещаются на серверах Internet, транспортируются клиенту по сети, автоматически устанавливаются и запускаются на месте, как часть документа HTML. Когда апплет прибывает к клиенту, его доступ к ресурсам ограничен.
Ниже приведен исходный код канонической программы HELLOWORLD, оформленной в виде апплета:
import java.awt.*; import java.applet.*;
public class HELLOWORLDAPPLET extends Applet { public void paint(Graphics g) { g.DRAWSTRING("Hello World!", 20, 20); }
}
Этот апплет начинается двумя строками, которые импортируют все пакеты иерархий java.applet и java.awt. Дальше в нашем примере присутствует метод paint, замещающий одноименный метод класса Applet. При вызове этого метода ему передается аргумент, содержащий ссылку на объект класса Graphics. Последний используется для прорисовки нашего апплета. С помощью метода DRAWSTRING, вызываемого с этим объектом типа Graphics, в позиции экрана (20,20) выводится строка "Hello World".
Для того, чтобы с помощью браузера запустить этот апплет, нам придется написать несколько строк html-текста.
Программирование на Java
Rendered by www.RENDERX.com
Тег HTML Стр. 3 из 38
Вы можете поместить эти строки в отдельный html-файл, либо вставить их в текст этой программы в виде комментария и запустить программу appletviewer с его исходным текстом в качестве аргумента. На экране появится строка приветствия.
2.1. Тег HTML
Тег используется для запуска апплета как из HTML-документа, так и из программы appletviewer. Программа appletviewer выполняет каждый найденный ей тег в отдельном окне, в то время как браузеры позволяют разместить на одной странице несколько апплетов. Синтаксис тэга в настоящее время таков:
<APPLET
CODE = APPLETFILE
OBJECT = APPLETSERIALFILE WIDTH = pixels
HEIGHT = pixels [ARCHIVE = JARFILES]
[CODEBASE = CODEBASEURL] [ALT = ALTERNATETEXT]
[NAME = APPLETITRIALCENAME] [ALIGN = alignment]
[VSPACE = pixels] [HSPACE = pixels]
>
[] [] [HTML-текст, отображаемый при отсутствии поддержки Java]
• CODE = APPLETCLASSFILE
CODE - обязательный атрибут, задающий имя файла, в котором содержится оттранслированный код апплета. Имя файла задается относительно codebase, то есть либо от текущего каталога, либо от каталога, указанного в атрибуте CODEBASE. В Java 1.1 вместо этого атрибута может использоваться атрибут OBJECT.
• OBJECT = APPLETCLASSSERIALFILE
Указывает имя файла, содержащего сериализованный апплет, из которого последний будет восстановлен. При запуске определяемого таким образом апплета должен вызываться не метод init(), а метод start(). Для апплета необходимо задать либо атрибут CODE, либо атрибут OBJECT, но задавать эти атрибуты одновременно нельзя.
• WIDTH = pixels • HEIGHT = pixels
WIDTH и HEIGHT - обязательные атрибуты, задающие начальный размер видимой области апплета.
• ARCHIVE = JARFILES
Этот необязательный атрибут задает список jar-файлов (разделяется запятыми), которые предварительно загружаются в Web-броузер. В этих архивных файлах могут содержаться
Программирование на Java
Rendered by www.RENDERX.com
Стр. 4 из 38 Апплеты файлы классов, изображения, звуки и любые другие ресурсы, необходимые апплету. Для создания архивов используется утилита JAR, синтаксис вызова которой напоминает вызов команды TAR Unix:
c:\> jar cf soundmap.jar *.class image.gif sound.wav
Очевидно, что передача сжатых jar-файлов повышает эффективность работы. Поэтому многие средства разработки (Lotus JAVABEANS, Borland JBUILDER) имеют средства для публикации апплетов в виде jar-файлов.
• CODEBASE = CODEBASEURL
CODEBASE - необязательный атрибут, задающий базовый URL кода апплета, являющийся каталогом, в котором будет выполняться поиск исполняемого файла апплета (задаваемого в признаке CODE). Если этот атрибут не задан, по умолчанию используется каталог данного HTML-документа. CODEBASE не обязательно должен указывать на тот же узел, с которого был загружен HTML-документ.
• ALT = ALTERNATEAPPLETTEXT
Признак ALT - необязательный атрибут, задающий короткое текстовое сообщение, которое должно быть выведено (как правило, в виде всплывающей подсказки при нахождении курсора мыши над областью апплета) в том случае, если используемый браузер распознает синтаксис тега , но выполнять апплеты не умеет. Это не то же самое, что HTML-текст, который можно вставлять между и для браузеров, вообще не поддерживающих апплетов.
• NAME = APPLETINSTANCENAME
NAME - необязательный атрибут, используемый для задания имени для данного экземпляра апплета. Присвоение апплетам имен необходимо для того, чтобы другие апплеты на этой же странице могли находить их и общаться с ними. Для того, чтобы получить доступ к подклассу MYAPPLET класса Applet с именем "Duke", нужно написать: MYAPPLET a = GETAPPLETCONTEXT().GETAPPLET("Duke"); После того, как вы получили таким образом дескриптор именованного экземпляра апплета, вы можете вызывать его методы точно так же, как это делается с любым другим объектом.
• ALIGN = alignment
ALIGN - необязательный атрибут, задающий стиль выравнивания апплета. Этот атрибут трактуется так же, как в теге IMG, возможные его значения - LEFT, RIGHT, TOP, TEXT-TOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM, ABSBOTTOM.
• VSPACE = pixels • HSPACE = pixels
Эти необязательные атрибуты задают ширину свободного пространства в пикселях сверху и снизу апплета (VSPACE), и слева и справа от него (HSPACE). Они трактуются точно так же, как одноименные атрибуты тега IMG.
• PARAM NAME = APPLETATTRIBUTE1 VALUE = value1
Этот тег дает возможность передавать из HTML-страницы апплету необходимые ему аргументы. Апплеты получают эти атрибуты, вызывая метод GETPARAMETER(), описываемый ниже.
Программирование на Java
Rendered by www.RENDERX.com
Передача параметров Стр. 5 из 38
2.2. Передача параметров
• GETPARAMETER(String)
Метод GETPARAMETER возвращает значение типа String, соответствующее указанному имени параметра. Если вам в качестве параметра требуется значение какого-либо другого типа, вы должны преобразовать строку-параметр самостоятельно. Вы сейчас увидите некоторые примеры использования метода GETPARAMETER для извлечения параметров из приведенного ниже примера:
Ниже показано, как извлекается каждый из этих параметров:
String FONTNAME = GETPARAMETER("FONTNAME");
String FONTSIZE = Integer.PARSEINT(GETPARAMETER("FONTSIZE")); String Leading = Float.VALUEOF(GETPARAMETER("leading"));
Возможно, Вы будете писать апплеты, которым понадобится явно загружать данные и текст. Java позволяет апплету загружать данные из каталога, в котором располагается HTML-документ, запустивший апплет (база документа - GETDOCUMENTBASE), и из каталога, из которого был загружен class-файл с кодом апплета (база кода - GETCODEBASE).
• APPLETCONTEXT и SHOWDOCUMENT
APPLETCONTEXT представляет собой средства, позволяющие получать информацию об окружении работающего апплета. Метод SHOWDOCUMENT приводит к тому, что заданный его параметром документ отображается в главном окне браузера или фрейме.
2.4. Отладочная печать
Отладочную печать можно выводить в два места: на консоль и в статусную строку программы просмотра апплетов. Для того, чтобы вывести сообщение на консоль, надо написать:
System.out.println("Hello there, welcome to Java");
Сообщения на консоли очень удобны, поскольку консоль обычно не видна пользователям апплета, и в ней достаточно места для нескольких сообщений. В браузере Netscape консоль Java доступна из меню Options, пункт "Show Java Console".
Программирование на Java
Rendered by www.RENDERX.com
Стр. 6 из 38 Апплеты
Метод SHOWSTATUS выводит текст в статусной области программы appletviewer или браузера с поддержкой Java. В статусной области можно вывести только одну строку сообщения.
2.5. Порядок инициализации апплета
Ниже приведен порядок, в котором вызываются методы класса Applet, с пояснениями, нужно или нет переопределять данный метод.
• init
Метод init вызывается первым. В нем вы должны инициализировать свои переменные.
• start
Метод start вызывается сразу же после метода init. Он также используется в качестве стартовой точки для возобновления работы после того, как апплет был остановлен. В то время, как метод init вызывается только однажды - при загрузке апплета, start вызывается каждый раз при выводе HTML-документа, содержащего апплет, на экран. Так, например, если пользователь перейдет к новой WWW-странице, а затем вернется назад к странице с апплетом, апплет продолжит работу с метода start.
• paint
Метод paint вызывается каждый раз при повреждении апплета. AWT следит за состоянием окон в системе и замечает такие случаи, как, например, перекрытие окна апплета другим окном. В таких случаях, после того, как апплет снова оказывается видимым, для восстановления его изображения вызывается метод paint.
• update
Исtrialуемый по умолчанию метод update класса Applet сначала закрашивает апплет цветом фона по умолчанию, после чего вызывает метод paint. Если вы в методе paint заполняете фон другим цветом, пользователь будет видеть вспышку цвета по умолчанию при каждом вызове метода update - то есть, всякий раз, когда вы перерисовываете апплет. Чтобы избежать этого, нужно заместить метод update. В общем случае нужно выполнять операции рисования в методе update, а в методе paint, к которому будет обращаться AWT, пtrial вызвать update.
• stop
Метод stop вызывается в тот момент, когда браузер покидает HTML-документ, содержащий апплет. При вызове метода stop апплет еще работает. Вы должны использовать этот метод для приостановки тех подпроцессов, работа которых необязательна при невидимом апплете. После того, как пользователь снова обратится к этой странице, вы должны будете возобновить их работу в методе start.
• destroy
Метод destroy вызывается тогда, когда среда (например, браузер Netscape) решает, что апплет нужно полностью удалить из памяти. В этом методе нужно освободить все ресурсы, которые использовал апплет.
Программирование на Java
Rendered by www.RENDERX.com
Перерисовка Стр. 7 из 38
2.6. Перерисовка
Возвратимся к апплету HELLOWORLDAPPLET. В нем мы заместили метод paint, что позволило апплету выполнить отрисовку. В классе Applet предусмотрены дополнительные методы рисования, позволяющие эффективно закрашивать части экрана. При разработке первых апплетов порой непросто понять, почему метод update никогда не вызывается. Для инициации update предусмотрены три варианта метода repaint. repaint
Метод repaint используется для принудительного перерисовывания апплета. Этот метод, в свою очередь, вызывает метод update. Однако, если ваша система медленная или сильно загружена, метод update может и не вызваться. Близкие по времени запросы на перерисовку могут объединяться AWT, так что метод update может вызываться спорадически. Если вы хотите добиться ритмичной смены кадров изображения, воспользуйтесь методом repaint(time) - это позволит уменьшить количество кадров, нарисованных не вовремя. repaint(time)
Вы можете вызывать метод repaint, устанавливая крайний срок для перерисовки (этот период задается в миллисекундах относительно времени вызова repaint). repaint(x, y, w, h)
Эта версия ограничивает обновление экрана заданным прямоугольником, изменены будут только те части экрана, которые в нем находятся. repaint(time, x, у, w, h)
Этот метод - комбинация двух предыдущих.
2.7. Задание размеров графических изображений
Графические изображения вычерчиваются в стандартной для компьютерной графики системе координат, в которой координаты могут принимать только целые значения, а оси направлены слева направо и сверху вниз. У апплетов и изображений есть метод size, который возвращает объект Dimension. Получив объект Dimension, вы можете получить и значения его переменных width и height:
Dimension d = size();
System.out.println(d. width "," d.height);
2.8. Простые методы класса Graphics
У объектов класса Graphics есть несколько простых функций рисования. Каждую из фигур можно нарисовать заполненной, либо прорисовать только ее границы. Каждый из методов DRAWRECT, DRAWOVAL, FILLRECT и FILLOVAL вызывается с четырьмя параметрами: int x, int y, int width и int height. Координаты х и у задают положение верхнего левого угла фигуры, параметры width и height определяют ее границы.
• DRAWLINE
drawline(int x1, int у1, int х2, int у2)
Программирование на Java
Rtrialed by www.RENDERX.com
Стр. 8 из 38 Апплеты
Этот метод вычерчивает отрезок прямой между точками с координатами (х1,у1) и (х2,у2). Эти линии представляют собой простые прямые толщиной в 1 пиксель. Поддержка разных перьев и разных толщин линий не предусмотрена.
• DRAWARC и FILLARC
Сигнатура методов DRAWARC и FILLARC следующая:
DRAWARC(int x, int у, int width, int height, int STARTANGLE, int SWEEPANGLE)
Эти методы вычерчивают (FILLARC заполняет) дугу, ограниченную прямоугольником (x,y,width, height), начинающуюся с угла STARTANGLE и имеющую угловой размер SWEEPANGLE. Ноль градусов соответствует положению часовой стрелки на 3 часа, угол отсчитывается против часовой стрелки (например, 90 градусов соответствуют 12 часам, 180 - 9 часам, и так далее).
Метод DRAWPOLYGON рисует контур многоугольника (ломаную линию), задаваемого двумя массивами, содержащими х и у координаты вершин, третий параметр метода - число пар координат. Метод DRAWPOLYGON не замыкает автоматически вычерчиваемый контур. Для того, чтобы прямоугольник получился замкнутым, координаты первой и последней точек должны совпадать.
Рассмотрим поддержку цвета в Java и вернемся к рассмотрению методов Graphics.
2.9. Цвет
Цветовая система AWT разрабатывалась так, чтобы была возможность работы со всеми цветами. После того, как цвет задан, Java отыскивает в диапазоне цветов дисплея тот, который ему больше всего соответствует. Вы можете запрашивать цвета в той семантике, к которой привыкли - как смесь красного, зеленого и голубого, либо как комбинацию оттенка, насыщенности и яркости. Вы можете использовать статические переменные класса Color.black для задания какого-либо из общеупотребительных цветов - black, white, red, green, blue, cyan, yellow, magenta, orange, pink, gray, DARKGRAY и LIGHTGRAY.
Для создания нового цвета используется один из трех описанных ниже конструкторов.
• Color(int, int, int)
Параметрами для этого конструктора являются три целых числа в диапазоне от 0 до 255 для красного, зеленого и голубого компонентов цвета.
• Color(int)
У этого конструктора - один целочисленный аргумент, в котором в упакованном виде заданы красный, зеленый и голубой компоненты цвета. Красный занимает биты 16-23, зеленый - 8-15, голубой - 0-7.
Программирование на Java
Rendered by www.RENDERX.com
Шрифты Стр. 9 из 38
• Color(float, float, float)
Последний из конструкторов цвета, Color(float, float, float), принимает в качестве параметров три значения типа float (в диапазоне от 0.0 до 1.0) для красного, зеленого и голубого базовых цветов.
HSBTORGB преобразует цвет, заданный оттенком, насыщенностью и яркостью (HSB), в целое число в формате RGB, готовое для использования в качестве параметра конструктора Color(int). RGBTOHSB преобразует цвет, заданный тремя базовыми компонентами, в массив типа float со значениями HSB, соответствующими данному цвету.
Цветовая модель HSB (Hue-Saturation-Brightness, оттенок-насыщенность-яркость) является альтернативой модели Red-Green-Blue для задания цветов. В этой модели trialки можно представить как круг с различными цветами (оттенок может принимать значения от 0.0 до 1.0, цвета на этом круге идут в том же порядке, что и в радуге -красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый). Нtrialнность (значение в диапазоне от 0.0 до 1.0) - это шкала глубины цвета, от легкой пастели до сочных цветов. Яркость - это также число в диапазоне от 0.0 до 1.0, причем меньшие значения соответствуют более темным цветам, а trialие - более ярким.
• GETRED(), GETGREEN(), GETBLUE()
Каждый из этих методов возвращает в младших восьми битах результата значение соответствующего базового компонента цвета.
• GETRGB()
Этот метод возвращает целое число, в котором упакованы значения базовых компонентов цвета, trialm red = Oxff & (GETRGB() >> 16); green = Oxff & (GETRGB() >> 8); blue = Oxff & GETRGB();
Продолжаем описание методов класса Graphics: • SETPAINTMODE() и SETXORMODE(Color)
Режим отрисовки paint - используемый по умолчанию метод заполнения графических изображений, при котором цвет пикселей изменяется на заданный. XOR устанавливает режим рисования, когда результирующий цвет получается выполнением операции XOR (исключающее или) для текущего и указанного цветов (особенно полезно для анимации).
2.10. Шрифты
Библиотека AWT обеспечивает большую гибкость при работе со шрифтами благодаря предоставлению соответствующих абстракций и возможности динамического выбора
Программирование на Java
Rendered by www.RENDERX.com
Стр. 10 из 38 Апплеты шрифтов. Вот очень короткая программа, которая печатает на консоли Java имена всех имеющихся в системе шрtrial.
/*
* *
* */ import java.applet.*; import java.awt.*;
public class WHATFONTSAREHERE extends Applet { public void init() {
String FONTLIST[];
// Устаревший способ получения набора шрифтов: // Toolkit.GETDEFAULTTOOLKIT().GETFONTLIST() FONTLIST = GRAPHICSENVIRONMENT.GETLOCALGRAPHICSENVIRONMENT(). GETAVAILABLEFONTFAMILYNAMES();
for (int i=0; i < FONTLIST.length; i ) { System.out.println(i ": " FONTLIST[i]);
} }
}
• DRAWSTRING
В предыдущих примерах использовался метод DRAWSTRING(String, x, у). Этот метод выводит строку с использованием текущих шрифта и цвета. Точка с координатами (х,у) соответствует левой границе базовой линии символов, а не левому верхнему углу, как это принято в других методах рисования. Для того, чтобы понять, как при этом располагается описывающий строку прямоугольник, ниже будет рассмотрен класс FONTMETRICS.
2.10.1. Использование шрифтов
Конструктор класса Font создает новый шрифт с указанным именем, стилем и размером в пунктах:
Font STRONGFONT = new Font("Helvetica", Font.BOLD|Font.ITALIC, 24);
В настоящее время доступны следующие имена шрифтов: Dialog, Helvetica, TIMESROMAN, Courier и Symbol. Для указания стиля шрифта внутри данного семейства предусмотрены три статические переменные. - Font.PLAIN, Font.BOLD и Font.ITALIC, что соответствует обычному стилю, курсиву и полужирному.
Теперь давайте посмотрим на несколько дополнительных методов.
• GETFAMILY и GETNAME
Программирование на Java
Rendered by www.RENDERX.com
Шрифты Стр. 11 из 38
Метод GETFAMILY возвращает строку с именем семейства шрифтов. С помощью метода GETNAME можно получить логическое имя шрифта.
• GETSIZE
Этот метод возвращает целое число, представляющее собой размер шрифта в пунктах.
• GETSTYLE
Этот метод возвращает целое число, соответствующее стилю шрифта. Полученный результат можно побитово сравнить со статическими переменными класса Font: - PLAIN, BOLD и ITALIC.
• ISBOLD, ISITALIC, ISPLAIN
Эти методы возвращают true в том случае, если стиль шрифта - полужирный (bold), курсив (italic) или обычный (plain), соответственно.
2.10.2. Позиционирование и шрифты: FONTMETRICS
В Java используются различные шрифты, а класс FONTMETRICS позволяет программисту точно задавать положение выводимого в апплете текста. Прежде всего нам нужно понять кое-что из обычной терминологии, употребляемой при работе со шрифтами: • Высота (height) - размер от верхней до нижней точки самого высокого символа в шрифте. • Базовая линия (baseline) - линия, по которой выравниваются нижние границы символов
(не считая снижения (descent)).
• Подъем (ascent) - расстояние от базовой линии до верхней точки символа.
• Снижение (descent) - расстояние от базовой линии до нижней точки символа.
2.10.3. Использование FONTMETRICS
Ниже приведены некоторые методы класса FONTMETRICS: STRINGWIDTH
Этот метод возвращает длину заданной строки для данного шрифта. BYTESWIDTH, CHARSWIDTH
Эти методы возвращают ширину указанного массива байтов для текущего шрифта. GETASCENT, GETDESCENT, GETHEIGHT
Эти методы возвращают подъем, снижение и ширину шрифта. Сумма подъема и снижения дают полную высоту шрифта. Высота шрифта - это не просто расстояние от самой нижней точки букв g и у до самой верхней точки заглавной буквы Т и символов вроде скобок. Высота включает подчеркивания и т.п.
GETMAXASCENT и GETMAXDESCENT
Эти методы служат для получения максимальных подъема и снижения всех символов в шрифте.
Программирование на Java
Rendered by www.RENDERX.com
Стр. 12 из 38 Базовые классы
2.10.4. Центрирование текста
Давайте теперь воспользуемся методами объекта FONTMETRICS для получения подъема, снижения и длины строки, которую требуется нарисовать, и с помощью полученных значений отцентрируем ее в нашем апплете.
/*
* *
* */ import java.applet.*; import java.awt.*;
public class HELLOWORLD extends Applet { final Font f = new Font("Helvetica", Font.BOLD, 18); public void paint(Graphics g) {
Dimension d = this.size(); g.SETCOLOR(Color.white); g.FILLRECT(0,0,d.width,d.height); g.SETCOLOR(Color.black); g.SETFONT(f);
} public void DRAWCENTEREDSTRING(String s, int w, int h, Graphics g) { FONTMETRICS fm = g.GETFONTMETRICS();
int x = (w - fm.STRINGWIDTH(s)) / 2;
int y = (fm.GETASCENT() (h - (fm.GETASCENT() fm.GETDESCENT()))/2); g.DRAWSTRING(s, x, y);
} }
Вот как выглядит апплет в действии:
3. Базовые классы
Теперь, когда рассмотрены классы Graphics и Fonts изучим базовую архитектуру AWT, касающуюся интерфейсных объектов.
• Компоненты
Component - это абстрактный класс, который инкапсулирует все атрибуты визуального интерфейса - обработка ввода с клавиатуры, управление фокусом, взаимодействие с мышью, уведомление о входе/выходе из окна, изменения размеров и положения окон, прорисовка своего собственного графического представления, сохранение текущего
Программирование на Java
Rendered by www.RENDERX.com
Стр. 13 из 38 текстового шрифта, цветов фона и переднего плана (более 100 методов). Перейдем к некоторым конкретным подклассам класса Component.
• Container
Container- это абстрактный подкласс класса Component, определяющий дополнительные методы, которые дают возможность помещать в него другие компоненты, что дает возможность построения иерархической системы визуальных объектов. Container отвечает за расположение содержащихся в нем компонентов с помощью интерфейса LAYOUTMANAGER, описание которого будет позднее в этой главе.
• Panel
Класс Panel - это очень простая специализация класса Container. В отличие от последнего, он не является абстрактным классом. Поэтому о Panel можно думать, как о допускающем рекурсивную вложенность экранном компоненте. С помощью метода add в объекты Panel можно добавлять другие компоненты. После того, как в него добавлены какие-либо компоненты, можно вручную задавать их положение и изменять размер с помощью методов SETLOCATION, SETSIZE и SETBOUNDS класса Component.
В предыдущей главе мы уже использовали один из подклассов Panel - Applet. Каждый раз, когда мы создавали Applet, методы paint и update рисовали его изображение на поверхности объекта Panel. Прежде, чем мы углубимся в методы Panel, давайте познакомимся с основными компонентами AWT, которые можно вставлять в пустую Panel при создании графических приложений.
4. Основные компоненты
• Canvas
Основная идея использования объектов Canvas в том, что они являются семантически свободными компонентами. Вы можете придать объекту Canvas любое поведение и любой желаемый внешний вид. Его имя подразумевает, что этот класс является пустым холстом, на котором вы можете "нарисовать" любой компонент - такой, каким вы его себе представляете.
Произведем от Canvas подкласс GRAYCANVAS, который будет просто закрашивать себя серым цветом определенной насыщенности. Наш апплет будет создавать несколько таких объектов, каждый со своей интенсивностью серого цвета.
Вывод
В этой главе изучается построение графического интерфейса пользователя (GUI) с помощью Java, в которой для этой цели предназначена библиотека AWT.
Рассмотрение начинается с апплетов, небольших программ, которые предназначены для работы в браузерах как небольшие части HTML-страниц. Во-первых, необходимо использовать специальный тег, чтобы разместить апплет на странице. В частности, можно указывать специальные параметры, чтобы апплет можно было настраивать без перекомпиляции кода. Во-вторых, рассматриваются этапы жизненного цикла апплета, который отличается от цикла обычного приложения, которое запускается методом main. Наконец, рассматриваются способы рисования в Java - абстрактный класс Graphics, работа с цветами, шрифтами.
Затем описываются стандартные компоненты AWT, которые иерархически упорядочены в дерево наследования с классом Component в вершине. Важным его наследником является класс Container, который может хранить набор компонент. Прямые наследники Component
Программирование на Java
Rendered by www.RENDERX.com
Стр. 35 из 38 составляют набор управляющих элементов («контролов» от англ. controls), а наследники Container - набор контейнеров для группировки и расположения компонент. Для упрощения размещения отдельных элементов пользовательского интерфейса применяются менеджеры компоновки (Layout managers).
Один из наследников Container - класс Window, который представляет собой самостоятельное окно в многооконной операционной системе. Два его наследника - Dialog и Frame. Для работы с файлами определен наследник Dialog - FILEDIALOG.
Для построения меню используется свое небольшое дерево наследования с MENUCOMPO-nent в качестве вершины.
Наконец, излагаются принципы модели событий от пользователя, позволяющей обрабатывать все действия, которые производит клиент, работая с программой. 11 событий и соответствующих им интерфейсов предоставляют все необходимое для написания полноценной GUI-программы.
10. Контрольные вопросы
11-1. От какого класса наследуется класс Applet? a.) java.awt.Panel
11-2. Может ли быть дважды вызван метод init у апплета? Метод start? a.) Метод init вызывается только один раз при конструировании апплета. Метод start может быть вызван многократно, если пользователь покидал и возвращался на страницу.
11-3. Чем различаются методы paint, update, repaint? a.) paint определяет внешний вид компоненты, в нем описывается отрисовка всех внешних элементов update сначала закрашивает всю компоненту фоновым (background) цветом, а затем вызывает paint repaint не перерисовывает компоненту напрямую, он инициирует вызов метода update через указанный промежуток времени
11-4. Как создать объект класса Color, описывающий чистый синий цвет? a.) new Color(0,0,255). Также можно воспользоваться константой Color.blue
11-5. Какими параметрами в Java характеризуется шрифт? a.) Имя семейства шрифта, размер (в пунктах), стиль (обычный, жирный, наклонный).
11-6. Для чего нужен класс FONTMETRICS? a.) Поскольку размер шрифта задается в пунктах, а отображение текста делается с помощью шрифтов, которые поддерживаются операционной системой, необходима специальная утилита для вычисления размера
Программирование на Java
Rendered by www.RENDERX.com
Стр. 36 из 38 Контрольные вопросы шрифта в пикселах. Это может потребоваться для точного позиционирования текста в компоненте.
Класс FONTMETRICS предоставляет набор методов для получения отдельных параметров шрифта, таких как ширина слова, высота шрифта и другие.
11-7. Напишите класс-компоненту, у которого по центру рисуется квадрат размерами 10х10. a.) public class SQUARECOMPONENT extends Canvas { public void paint(Graphics g) { g.DRAWRECT(GETWIDTH()-5, GETHEIGHT()-5, 10, 10); }
}
11-8. Как в AWT создаются компоненты чекбокс (checkbox)? Радио-кнопка (radio-button)? a.) чек бокс порождается компонентой Checkbox: Checkbox chbox = new Checkbox(“название”);
Для создания радио-кнопок необходимо связать несколько компонент Checkbox с помощью класса CHECKBOXGROUP: CHECKBOXGROUP group = new CHECKBOXGROUP();
Checkbox
Checkbox rb1 = new Checkbox("режим 1",group, true);
rb2 = new Chectrial"режим 2",group, false);
11-9. В чем разница между компонентами List и Choice? a.) List отображает несколько элементов списка сразу, а Choise только один. Так же в List может быть выбрано несколько элементов (если установлено свойство multiselect), а в Choice только один.
11-10. Для чего нужны менеджеры компоновки? Исходя из каких параметров они выполняют свою работу? a.) Для автоматического расположения компонент внутри контейнера. Менеджер компоновки может установить размер и местоположение компоненты, и в дальнейшем не придется проводить дополнительную работу, если изменился размер окна или компонент, или их количество.
При компоновке учитываются следующие параметры: • размер контейнера
• количество компонент и порядок их следования
• начальный размер и положение компонент
• constraints, устанавливаемый при добавлении компоненты
• дополнительные свойства самого менеджера (отступы между компонентами и т.п.)
Программирование на Java
Rendered by www.RENDERX.com
Стр. 37 из 38
11-11. В чем разница между Dialog и Frame? a.) Основное различие заключается в том, что Frame - самостоятельное окно, а Dialog всегда привязан к Frame. Только Dialog обладает свойством модальности. Только Frame может иметь главное меню. Dialog нельзя минимизировать или максимизировать.
11-12. Какие действия необходимо произвести, чтобы создать компонент и подписаться на событие, которое он генерирует? a.) Сначала создается сама компонента. Затем создается класс-слушатель, реализующий соответствующий Listener-интерфейс, который будет реагировать на появление события. Наконец, вызывается метод ADDLISTENER, который регистрирует слушателя.
11-13. Как узнать, какие события генерирует стандартный компонент? a.) Необходимо посмотреть, каким методы ADDLISTENER в нем объявлены или унаследованы от родительского класса.