Глава 10 (продолжение )
Вверх
Структура пакета awt
Классы пакета awt можно разделить на следующие группы:
Класс графики предоставляет возможность создавать фигуры, линии, изображения, а так же выбирать шрифты, цвета и т.д.
Компонентами называются такие элементы как кнопки, текстовые поля, разнообразные меню и полосы прокрутки. Мы можем поместить их в контейнеры, а затем выбрать один из менеджеров размещения для позиционирования на экране надлежащим образом.
Подпакет
Подпакет
Главными абстрактными классами являются
Мы воспользуемся для примера простой программой из гл 2, которая выводит на экран изображение флага. чтобы представить различные части пакета awt.
Swing
Вверх
Графический интерфейс реализуется посредством окон. В Java имеется класс Window, но на практике обычно используется один из его подклассов - Frame.
Frame - базисное окно
Приложение может иметь несколько окон, для каждого из которых объявляется класс, который наследует классу Frame и включает вызовы методов, необходимых для вызова информации в окно и выполнения других операций. Если используется одно окно (как в примере 2.2, когда мы выводим на экран флаг), главный класс программы и будет тем классом, который объявляет его. В следующем примере показано, как создается простое окно.
10.1 Введение в awt и Swing
java.awt.event
предназначен для обработки внешних событий (нажатий кнопок. перемещения мыши и тд) с помощью обработчиков событий, слушателей и адаптеров.
java.awt.image
используется пакетом awt для предоставления изображений в различных форматах. Общая схема главного пакета awt воспроизведена на рис 10.1.
Component, Container, MenuComponent и Graphics
. Наряду с ними существуют классы FontMetrics, Image, PrintJob и ToolKit
.
LayoutManager
- это интерфейс, а остальные представляют собой классы. унаследованные от тех, которые изображены выше. Таким образом класс Frame - это наследник класса Windows, являющегося потомком класса Container, предок которого называется Component.
10.2 Размещение графики в окне
Создание окна(определение класса, наследующего класс Frame) |
import java.awt.*;
|
Сначала импортируется пакет java.awt.
Затем класс, который должен содержать объект "фрейм", наследует классу Frame. В завершение класс создает объект(экземпляр самого себя), а его конструктор выполняет три основные функции: подготавливает к выводу заголовок окна (метод setTitle), задает его размеры (метод setSize) и активизирует процесс вывода фрейма с помощью метода setVisible. |
В классах Frame и Component обновляются три метода. Ниже показана часть объявления класса и конструктор для объекта, создающего флаг (пример 2.2).
FlagMaker ()
{
// Set the frame's title and size and activate the drawing
public void paint (Graphics g)
{
class FlagMaker extends Frame
{
// described by the paint method.
setTitle ("A Flag");
setSize (300, 200);
setVisible (true);
public static void main (String [ ] args)
{
Добавление графики в окно
На данном этапе выполнения программы пакет awt использует метод paint для добавления в окно графики. Метод paint определяется:
Вот описание метода paint
Переопределение метода paint |
public void paint (Graphics g)
{
|
Метод paint вызывается когда компонент становится видимым, а так же когда окно, в котором он находится, скрыто и должно быть выведено заново.
Метод repaint может быть вызван программой для той же цели. |
В процессе выполнения метод paint использует объект Graphics, адаптированный для платформы, на которой запущена программа. Это одно из преимуществ языка Java: используются графические элементы конкретной платформы, то есть пакет awt выводит на экран компоненты, знакомые пользователю.
Класс Graphics довольно обширен, поэтому мы смогли дать характеристику только для некоторых из его методов:
Спецификация класса Graphics |
clearRect (int x, int y, int width, int height);
|
К числу тринадцати стандартных цветов относятся следующие: black, blue, cyan, darkGray, gray, lightGray, magenta, orange, pink, red, white, yellow. Например для черчения красного прямоугольника служит такой метод:
public void repaint (Graphics g)
{
g.fillRect(10, 10, 200, 100);
Вывод текста в окне awt с помощью метода drawString
В процессе работы с пакетом Graphics используется метод drawString, который эквивалентен методу println. Например оператор
g.drawString("Hello Pierres:", 30, 15);
выведет на экран строку Hello Pierres, в которой левая нижняя точка буквы H находится на расстоянии 30 пикселей по горизонтали и 15 пикселей по вертикали от левого верхнего угла экрана.
Отличие между методами println и drawString состоит в том, что последний позволяет выбрать шрифт, а так же его начертание и размер. Впоследствии позиционирование начала строки может оказаться сложной задачей. Для создания универсальной программы, выводящей данные в удобочитаемом виде, следует опираться на относительные размеры символов. Абстрактный класс FontMetrics из пакета awt содержит методы, определяющие подходящие размеры символов, однако иногда в простых программах можно задавать и абсолютные размеры в пикселах. Теперь мы готовы к рассмотрению первого в этой главе примера.
Вверх
Пример 10.1 Вывод предупреждения о возможном заражении вирусом
Задача.
Вывести на экран окно с предупреждающим сообщением.
На рис 10.3 показан результат работы программы
Решение.
Мы воспользуеся окном, созданным при помощи пакета awt, методом drawString и описанными выше средствами для работы с прямоугольником. Чтобы сделать прямоугольник более броским, нам потребуется найти цветовое решение. Для работы с цветом предназначены методы setForeground и setBackground класса Component, а так же цветовые константы, определенные в классе Color. Мы остановим выбор на бирюзовом цвете, который соответствет константе Color.cyan
Программа. Программа очень проста
class VirusWarning extends Frame
{
/* The Graphic warning Program by J M Bishop Oct 1996
VirusWarning ()
{
public void paint(Graphics g)
{
public static void main(String[] args)
{
Тестирование
На рис 10.3 показан результат работы программы
Закрытие окна
Далее пойдет речь о том, как завершается выполнение программы, работающей в окне. Один из способов - закрыть окно, щелкнув на кнопке в его правом углу. Щелчок мышью - это событие, которое может быть воспринято слушателем из подпакета Event пакета awt.
В главном методе мы задаем ссылку на такой слушатель окна путем вызова метода addWindowListener и создания экземпляра новой версии адаптера окна WindowAdapter. В реализации адаптера, которая рассматривается ниже, переопределяется метод класса WindowAdapter, называемый WindowClosing, и выполняется соответствующее действие, в данном случае - вызов метода System.exit(0).
Ниже написана последовательность определений и действий, связанных с закрытием окна.
import java.awt.*;
import java.awt.event.*;
* Java 1.1 by T Abbott Oct 1997
* updated 1.2 by J Bishop May 2000
* produces a warning message on the screen in cyan
* and black.
* Illustrates setting up a window, painting in it
* and enabling the close box.
*/
setSize(220,150);
setBackground(Color.cyan);
setForeground(Color.black);
addWindowListener(new WindowAdapter ()
{
setVisible(true);
g.fillRect(25, 30, 150, 90);
g.setColor(Color.black);
g.drawString("W A R N I N G", 70, 60);
g.drawString("Possible virus detected", 45, 75);
g.drawString("Reboot and run virus", 50, 90);
g.drawString("remover software", 60, 105);
Закрытие окна |
addWindowListener(new WindowAdapter ()
{
|
Класс WindowAdapter - это простой абстрактный класс, который реализует интерфейс WindowListener и предоставляет абстрактные методы для различных содержащихся в нем методов. Мы можем решить, какой из них переопределить. В данном случае из семи имеющихся методов нас интересует только WindowClosing, Создание экземпляра объекта WindowAdapter и переопределение метода WindowClosing осуществляется при передаче параметра методу addWindowListener. |
В этом описании все слова являются или ключевыми (выделены жирным шрифтом) или идентификаторами, которые уже определены в пакете awt, за исключением параметра (событие "e"), который не используется, поэтому всегда может оставаться неизменным. Код описания можно рассматривать как мантру и помещать в главный метод любых GUI-программ. В коде используется анонимный класс, представленный в разделе 8.2.
Применению анонимного класса существует альтернатива: методу addWindowListener в качестве параметра можно передавать выражение new x(), а затем определить x как локальный класс с заголовком, в котором указано, что данный класс расширяет класс WindowAdapter, и телом, являющимся реализацией WindowClosing. Очевидно, что в любом случае код анонимного класса выглядит компактнее.
Вверх
Пример 10.2
Гистограмма уровней осадков в Саванне
Задача.
Решение.
Алгоритм.
Создаваемый класс будет наследовать класс Frame. Для того. чтобы вывести окно, в главную программу мы включим те же инструкции, которые использовались в предыдущей.
Конструктор будет иным. Мы воспользуемся им для ввода всех данных, необходимых для решения текущей задачи (ранее с этой целью применялся метод readIn). ОДнако содержимое не меняется. Наиболее важная часть программы связана с отображением диаграммы. Необходимо получить на выходе такую же гистограмму, как на рис 10.4
Рассмотрим составные части диаграммы поочередно:
Размер шрифта выражается в пунктах. Нормальным считается размер 12 пунктов. Если же текст должен быть крупным, можно установить размер 24 пункта. Не рекомендуется применять шрифт, размер которого меньше 8 пунктов. Поскольку измененный шрифт используется последним из используемых в программе методом drawString, восстанавливать его не потребуется.
Рис 10.4 Результат выполнения программы "Гистограмма уровней осадков в Саванне"
Программа
Настоящая программа показывает, что графика может быть очень мощным инструментом, если одни и те же элементы используются многократно. Но когда каждая деталь требует индивидуальной обработки и при этом используется только один раз, программирование становится довольно трудоемким процессом. Подтверждением сказанному служат следующие примеры.
class WeatherChart extends Frame
{
/* The Weather Charting program by J M Bishop Dec 1997
int base = 1950;
WeatherChart () throws IOException
{
public void paint (Graphics g)
{
// the axes
// labelling the axes
// the title
// the bars
void getData () throws IOException
{
int actualYear = 0; /* e.g. 1997 */
public static void main(String[] args) throws IOException
{
Stream fin = new Stream ("rain.dat", Stream.READ);
Затем из потока в цикле в двумерный массив rainTable.
for (int m = 0; m < 12; m++)
Назад |
Начало урока |
Вверх |
Вперед
g.fillRect(month*(width+gap)+gap+x, y-a,width,a);
// labelling the axes
for (int m = 0; m < 12; m++)
import java.io.*;
import javagently.*;
import java.awt.*;
import java.awt.event.*;
import myutilities.*; // for the Stats class
* Java 1.1
* updated May 2000
* Draws a histogram of monthly rainfall
* from data taken over a few years.
* The data must be in the form:
* year followed by the 12 rainfall figures for
* the months of that year.
* Illustrates simple graphics.
* Uses the Stats class from myutilities.
*/
int startYear, endYear, nYears = 0;
double[][] rainTable = new double[12][70];
String months [] =
{
setTitle("Weather Chart");
setSize(400,350);
setVisible(true);
addWindowListener(new WindowAdapter()
{
int y = 300;
int width = 20;
int gap = 5;
g.drawLine (x,y,x+12*(width+gap),y);
g.drawLine (x,y,x,30);
for (int m = 0; m < 12; m++)
Font heading = new Font("SansSerif",Font.BOLD,14);
g.setFont(heading);
g.drawString("Savanna Rainfall Chart",120,40);
g.setColor(Color.cyan);
for (int month = 0; month < 12; month++)
{
g.fillRect(month*(width+gap)+gap+x, y-a,width,a);
int yearIndex = 0; /* e.g. 0 */
try
{
if (yearIndex == 0)
catch (EOFException e)
{
endYear = actualYear;
nYears = endYear-startYear+1;
В функции getData происходит считывание данных из текстового файла в поток:
Содержание