Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






M1 и m2 эквивалентны




массив m1: b c z

значение 'c' находится в позиции 1

[35, 71, 92]

True

массив m3: b c z □ □

Задания к главе 10

Вариант A

1. Ввести строки из файла, записать в список. Вывести строки в файл в обратном порядке.

2. Ввести число, занести его цифры в стек. Вывести число, у которого цифры идут в обратном порядке.

3. Создать в стеке индексный массив для быстрого доступа к записям в бинарном файле.

4. Создать список из элементов каталога и его подкаталогов.

5. Создать стек из номеров записи. Организовать прямой доступ к элементам записи.

6. Занести стихотворения одного автора в список. Провести сортировку по возрастанию длин строк.

7. Задать два стека, поменять информацию местами.

8. Определить множество на основе множества целых чисел. Создать методы для определения пересечения и объединения множеств.

9. Списки (стеки, очереди) I(1..n) и U(1..n) содержат результаты n-измерений тока и напряжения на неизвестном сопротивлении R. Найти приближенное число R методом наименьших квадратов.

10. С использованием множества выполнить попарное суммирование произвольного конечного ряда чисел по следующим правилам: на первом этапе суммируются попарно рядом стоящие числа, на втором этапе суммируются результаты первого этапа и т.д. до тех пор, пока не останется одно число.

11. Сложить два многочлена заданной степени, если коэффициенты многочленов хранятся в объекте HashMap.

12. Умножить два многочлена заданной степени, если коэффициенты многочленов хранятся в различных списках.

13. Не используя вспомогательных объектов, переставить отрицательные элементы данного списка в конец, а положитель­ные – в начало этого списка.

14. Ввести строки из файла, записать в список ArrayList. Выполнить сортировку строк, используя метод sort() из класса Collections.

15. Задана строка, состоящая из символов '(', ')', '[', ']', '{', '}'. Проверить правильность расстановки скобок. Использовать стек.

16. Задан файл с текстом на английском языке. Выделить все различные слова. Слова, отличающиеся только регистром букв, считать одинаковыми. Использовать класс HashSet.

17. Задан файл с текстом на английском языке. Выделить все различные слова. Для каждого слова подсчитать частоту его встречаемости. Слова, отличающиеся регистром букв, считать различными. Использовать класс HashMap.

Вариант B

1. В кругу стоят N человек, пронумерованных от 1 до N. При ведении счета по кругу вычеркивается каждый второй человек, пока не останется один. Составить две программы, моделирующие процесс. Одна из программ должна использовать класс ArrayList, а вторая – LinkedList. Какая из двух программ работает быстрее? Почему?

2. Задан список целых чисел и число X. Не используя вспомогательных объектов и не изменяя размера списка, переставить элементы списка так, чтобы сначала шли числа, не превосходящие X, а затем числа, большие X.

3. Написать программу, осуществляющую сжатие английского текста. Построить для каждого слова в тексте оптимальный префиксный код по алгоритму Хаффмена. Использовать класс PriorityQueue.

4. Реализовать класс Graph, представляющий собой неориентированный граф. В конструкторе класса передается количество вершин в графе. Методы должны поддерживать быстрое добавление и удаление ребер.

5. На базе коллекций реализовать структуру хранения чисел с поддержкой следующих операций:

· добавление/удаление числа;

· поиск числа, наиболее близкого к заданному (т.е. модуль разницы минимален).

6. Реализовать класс, моделирующий работу N-местной автостоянки. Машина подъезжает к определенному месту и едет вправо, пока не встретится свободное место. Класс должен поддерживать методы, обслуживающие приезд и отъезд машины.

7. Во входном файле хранятся две разреженные матрицы А и В. По­строить циклически связанные списки СА и СВ, содержащие не­нулевые элементы соответственно матриц А и В. Просматривая списки, вычислить: а) сумму S = A + B; б) произведение P = A * B.

8. Во входном файле хранятся наименования некоторых объектов. Построить список C1, элементы которого содержат наименова­ния и шифры данных объектов, причем элементы списка должны быть упорядочены по возрастанию шифров. Затем “сжать” список C1, удаляя дублирующие наименования объектов.

9. Во входном файле расположены два набора положительных чисел; между наборами стоит отрицательное число. Построить два списка C1 и С2, элементы которых содержат соответственно числа 1-го и 2-го набора таким образом, чтобы внутри одного списка числа были упорядочены по возрастанию. Затем объединить списки C1 и С2 в один упорядоченный список, изменяя только значения полей ссылочного типа.

10. Во входном файле хранится информация о системе главных автодорог, связывающих г.Минск с другими городами Беларуси. Используя эту информацию, постройте дерево, отображающее систему дорог респуб­лики, а затем, продвигаясь по дереву, определить минимальный по длине путь из г.Минска в другой заданный город. Предусмотреть возможность для последующего сохранения дерева в виртуальной памяти.

11. Один из способов шифрования данных, называемый «двойным шифрованием», заключается в том, что исходные данные при помощи некоторого преобразования последовательно шифруются на некоторые два ключа K1 и K2. Разработать и реализовать эффективный алгоритм, позволяющий находить ключи K1 и K2 по исходной строке и ее зашифрованному варианту. Проверить, оказался ли разработанный способ действительно эффективным, протестировав программу для случая, когда оба ключа К1 и К2 являются 20-битными (время ее работы не должно превосходить одной минуты).

12. На плоскости задано N точек. Вывести в файл описания всех прямых, которые проходят более чем через одну точку из заданных. Для каждой прямой указать, через сколько точек она проходит. Использовать класс HashMap.

13. На клетчатой бумаге нарисован круг. Вывести в файл описания всех клеток, целиком лежащих внутри круга, в порядке возрастания расстояния от клетки до центра круга. Использовать класс PriorityQueue.

14. На плоскости задано N отрезков. Найти точку пересечения двх отрез­ков, имеющую минимальную абсциссу. Использовать класс TreeMap.

15. На клетчатом листе бумаги закрашена часть клеток. Выделить все различные фигуры, которые образовались при этом. Фигурой считается набор закрашенных клеток, достижимых друг из друга при движении
в четырёх направлениях. Две фигуры являются различными, если их нельзя совместить поворотом на угол, кратный 90 градусам, и параллельным переносом. Используйте класс HashSet.

16. Дана матрица из целых чисел. Найти в ней прямоугольную подмат­рицу, состоящую из максимального количества одинаковых элементов. Использовать класс Stack.

17. Реализовать структуру "черный ящик", хранящую множество чисел и имеющую внутренний счетчик K, изначально равный нулю. Структура должна поддерживать операции добавления числа в множество и возвращение K-го по минимальности числа из множества.

18. На прямой гоночной трассе стоит N автомобилей, для каждого из которых известны начальное положение и скорость. Определить, сколько произойдет обгонов.

19. На прямой гоночной трассе стоит N автомобилей, для каждого из которых известны начальное положение и скорость. Вывести первые K обгонов.

Тестовые задания к главе 10

Вопрос 10.1.

Какой интерфейс наиболее пригоден для создания класса, содержащего несортированные уникальные объекты?

1) Set;

2) List;

3) Map;

4) Vector;

5) нет правильного ответа.

Вопрос 10.2.

Какие из фрагментов кода создадут объект класса ArrayList и добавят элемент?

1) ArrayList a = new ArrayList(); a.add(“0”);

2) ArrayList a = new ArrayList(); a[0]=“0”;

3) List a = new List(); a.add(“0”);

4) List a = new ArrayList(10); a.add(“0”);

Вопрос 10.3.

Какой интерфейс реализует класс Hashtable?

1) Set;

2) Vector;

3) AbstractMap;

4) List;

5) Map.

Вопрос 10.4.

Дан код:

import java.util.*; class Quest4 { public static void main (String args[]) { Object ob = new HashSet();System.out.print((ob instanceof Set) + ", ");System.out.print(ob instanceof SortedSet);}}

Что будет выведено при попытке компиляции и запуска программы?

1) true, false;

2) true, true;

3) false, true;

4) false, false;

5) ничего из перечисленного.

Вопрос 10.5.

Какие из приведенных ниже названий являются именами интерфейсов пакета java.util?

1) SortedMap;

2) HashMap;

3) HashSet;

4) SortedSet;

5) Stack;

6) AbstractMap.

 
Глава 11

ГРАФИЧЕСКИЕ ИНТЕРФЕЙСЫ ПОЛЬЗОВАТЕЛЯ

Основы оконной графики

Для поддержки пользовательских интерфейсов язык Java содержит библиотеки классов, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений. Графические инструменты и интерфейсы пользователя в языке Java реализованы с помощью двух библиотек:

· Пакет AWT(загружается java.awt) содержит набор классов, позволяющих выполнять графические операции и создавать элементы управления. Этот пакет поддерживается последующими версиями языка, однако считается весьма ограниченным и недостаточно эффективным.

· Пакет Swing (загружается javax.swing, имя javax обозначает, что пакет не является основным, а только расширением языка) содержит улучшенные и обновленные классы, по большей части аналогичные AWT. К именам этих классов добавляется J (JButton, JLabel
и т.д.). Пакет является частью библиотеки JFC (Java Foundation Classes), которая содержит большой набор компонентов JavaBeans, предназначенных для создания пользовательских интерфейсов.

Библиотека Swing, в отличие от AWT, более полно реализует парадигму объектно-ориентированного программирования. К преимуществам библиотеки Swing следует отнести повышение надежности, расширение возможностей пользовательского интерфейса, а также независимость от платформы. Кроме того, библиотеку Swing легче использовать, она визуально более привлекательна.

Работа с окнами и графикой в Java осуществляется в апплетах и графических приложениях. Апплеты – это небольшие программы, встраиваемые в Web-документ и использующие для своей визуализации средства Web-браузера. Графические приложения сами отвечают за свою прорисовку.

Апплеты используют окна, производные от класса Panel, графические приложения используют окна, производные от класса Frame, порожденного от класса Window.

Иерархия базовых классов AWT и Swing, применяемых для построения визуальных приложений, приведена на рисунке 11.1.

Суперкласс java.awt.Component является абстрактным классом, инкапсулирующим все атрибуты визуального компонента. Класс содержит большое число методов для создания компонентов управления и событий, с ними связанных.

Рис. 11.1. Иерархия классов основных графических компонентов AWT и Swing

Порожденный от него подкласс Container содержит методы типа add(), кото­рые позволяют вкладывать в него другие компоненты (объекты) и отвечает за размещение любых компонентов, которые он содержит. Класс Container порождает классы Panel и Window – фундаментальные классы при создании апплетов и фреймов.

Класс Panel используется апплетом, графический вывод которого рисуется на поверхности объекта Panel -окна, не содержащего области заголовка, строки меню и обрамления. Основу для его отображения предоставляет браузер.

Графические приложения используют класс Window (окно верхнего уровня), который является основой для организации фрейма, но сам непосредственно для вывода компонент не используется. Для этого применяется его подкласс Frame. С помощью объекта типа Frame создается стандартное окно со строкой заголовка, меню, размерами.

Аналогично классы из пакета Swing используют для вывода графических изображений окна JPanel и JFrame. Еще один используемый для вывода класс Canvas, представляющий пустое окно, в котором можно рисовать, является наследником класса Component.

Апплеты

Графические интерфейсы, рисунки и изображения могут быть реализованы в апплетах. Апплеты представляют собой разновидность графических приложений, реализованных в виде классов языка Java, которые размещаются на серверах Internet, транспортируются клиенту по сети, автоматически устанавливаются и запускаются браузером как часть документа HTML. Апплеты позволяют вставлять в документы поля, содержание которых меняется во времени, организовывать "бегущие строки", меню, мультипликацию, производить вычис­ления на клиентской странице. Апплеты выполняются браузером при отображении HTML-документа или просматриваются программой appletviewer. Апплеты не могут записывать файлы и читать информацию из файлов. Эти ограничения связаны с проблемой безопасности клиентского компьютера, поскольку клиенты не желают запускать «троянского коня» в свой компьютер. Существует несколько уровней безопасности, устанавливаемых клиентом для апплетов, загружаемых с сервера (надежные апплеты). Класс Applet обеспечи­вает интерфейс между апплетами и их окружением. Апплеты являются наследниками класса Applet из пакета java.applet из пакета AWT или его подкласса JApplet из пакета Swing.

Есть несколько методов класса Applet, которые управляют созданием и выполнением апплета на Web-странице. Апплету не нужен метод main(),код запуска помещается в методе init(). Перегружаемый метод init() автома­тически вызывается при загрузке апплета для выполнения начальной инициализации. Метод start() вызывается каждый раз, когда апплет переносится в поле зрения браузера, чтобы начать операции. Метод stop() вызывается каждый раз, когда апплет выходит из поля зрения Web-браузера, чтобы позволить апплету завершить операции. Метод destroy() вызывается, когда апплет начинает выгружаться со страницы для выполнения финального осво­бождения ресурсов. Кроме этих методов, при выполнении апплета автоматически запускается метод paint() класса Component. Метод paint() не вызывается явно, а только из других методов, например из метода repaint(), если необходима перерисовка.

Ниже приведен пример апплета, в котором используются методы init(), paint(), метод setColor() установки цвета символов и метод drawString() рисования строк.

/* пример # 1: вывод даты: DateApplet.java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.util.Calendar;

import java.util.Formatter;

import javax.swing.JApplet;

 

public class DateApplet extends JApplet {

private Formatter dateFmt = new Formatter();

private Formatter timeFmt = new Formatter();

 

public void init() {

setSize(180, 100);

Calendar c = Calendar.getInstance();

String era = "";

if (c.get(Calendar.ERA) == 1)

era = "н.э.";

dateFmt.format("%tA %td.%tm.%tY года "

+ era, c, c, c, c);

timeFmt.format("%tT", c);

}

public void paint(Graphics g) {

g.setColor(Color.RED);

g.drawString("Апплет стартовал в " + timeFmt,

10, getHeight()/2);

g.setColor(new Color(0,87,127));

g.drawString(dateFmt.toString(), 13,

getHeight() - 10);

}

}

Рис. 11.2. Вывод строки и даты

Доступ к элементам даты осуществлен с помощью класса java.util.Calendar. Цвет выводимых символов устанавливается с помощью полей класса Color.

После выполнения компиляции имя класса, содержащего байт-код апплета, помещается в тег <applet параметры > </applet> документа HTML. Например:

<html>

<applet code = chapt11.DateApplet.class

width = 250 height = 250> </applet></html>

Исполнителем HTML-документа является браузер, который и запускает соответствующий ссылке апплет.

Большинство используемых в апплетах графических методов, как и исполь­зованные в примере методы setColor(), drawString(), – методы абстрактного базового класса java.awt.Graphics. Класс Graphics представляет гра­фический контекст для рисования, который затем отображается на физическое устройство. Методы апплета получают объект класса Graphics (графический кон­текст) в качестве параметра и вместе с ним – текущий цвет, шрифт, положение курсора. Установку контекста обычно осуществляют методы update() или paint().

Ниже перечислены некоторые методы класса Graphics:

drawLine(int x1, int y1, int x2, int y2) – рисует линию;

drawRect(int x, int y, int width, int height) и fillRect(int x, int y, int width, int height) – рисуют прямоугольник и заполненный прямоугольник;

draw3DRect(int x, int y, int width, int height, boolean raised) – рисует трехмерный прямоугольник;

drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) – рисует округленный прямоугольник;

drawOval(int x, int y, int width, int height) – рисует овал;

drawPolygon(int[] xPoints, int[] yPoints, int nPoints) – рисует полигон (многоугольник), заданный массивами координат x и y;

drawPolygon(Polygon p) – рисует полигон, заданный объектом Polygon;

drawPolyline(int[] xPoints, int[] yPoints, int nPoints) – рисует последовательность связных линий, заданных массивами x и y;

drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) – рисует дугу окружности;

drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) – вставляет изображение;

drawString(String str, int x, int y) – рисует строку;

setColor(Color c), getColor() – устанавливает и возвращает текущий цвет;

getFont() – возвращает текущий шрифт;

setFont(Font font) – устанавливает новый шрифт.

Методы класса Graphics используются для отображения графики как для классов Applet, так и для классов JApplet.

В примерах 2–4, приведенных ниже, демонстрируется использование ме­тодов класса Graphics для вывода графических изображений в окно апплета.

/* пример # 2: трехмерные прямоугольники: ThrRect.java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JApplet;

 

public class ThrRect extends JApplet {

public void draw3D(Graphics g, int x, int y, int width, int height, boolean isRaised, boolean isFilled) {

g.draw3DRect(x, y, width - 1, height - 1,

isRaised);

g.draw3DRect(x + 1, y + 1, width - 3,

height - 3, isRaised);

g.draw3DRect(x + 2, y + 2, width - 5,

height - 5, isRaised);

if (isFilled)

g.fillRect(x + 3, y + 3, width - 6,

height - 6);

}

public void paint(Graphics g) {

g.setColor(Color.GRAY);

draw3D(g, 10, 5, 80, 40, true, false);

draw3D(g, 130, 5, 80, 40, false, false);

draw3D(g, 10, 55, 80, 40, true, true);

draw3D(g, 130, 55, 80, 40, false, true);

}

}

Рис. 11.3. Трехмерные прямоугольники

Пакет java.awt содержит большое число классов, используемых для вывода изображения: Color, Font, Image, Shape, Canvas и т.д. Кроме того, возможности этого пакета расширяют пакеты java.awt.geom, java.awt.color, java.awt.image и другие.

/* пример # 3: построение фигур: BuildShape.java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Shape;

import java.awt.geom.*;

import javax.swing.JApplet;

 

public class BuildShape extends JApplet {

public void init() {

setSize(200, 205);

}

public void paint(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

setBackground(Color.LIGHT_GRAY);

g2.rotate(Math.PI / 6);

drawChessBoard(g);

//поворот

g2.rotate(-Math.PI / 6);

g.setXORMode(new Color(200, 255, 250));

Shape e = new Ellipse2D.Float(70, 75, 70, 50);

//рисование эллипса

g2.fill(e);

}

//рисование шахматной доски

public void drawChessBoard(Graphics g) {

int size = 16;

for (int y = 0; y < 8; y++) {

for (int x = 0; x < 8; x++) {

if ((x + y) % 2 == 0)

g.setColor(Color.BLUE);

Else

g.setColor(Color.WHITE);

g.fillRect(75 + x * size, y * size - 25, size, size);

}

g.setColor(Color.BLACK);

 

g.drawString(new Character(

(char) ('8' - y)).toString(), 66, y * size - 13);

g.drawString(new Character(

(char) (y + 'a')).toString(),

79 + y * size, 8 * size - 14);

}

}

}

Рис. 11.4. Построение различных фигур

// пример # 4: вывод GIF-изображения: DrawImage.java

package chapt11;

import java.awt.Graphics;

import java.awt.Image;

import javax.swing.JApplet;

 

public class DrawImage extends JApplet {

private Image img;

 

public void init() {

//загрузка изображения из корня проекта

img = getImage(getCodeBase(), "joli.gif");

}

public void paint(Graphics g){

g.drawImage(img, 0, 0, this);

}

}

При использовании свойств тега <applet> существует возможность передать параметры из HTML-документа в код апплета. Пусть HTML-документ имеет вид:

<html><head><title>Параметры апплета</title></head>

<body>

<applet code=test.com.ReadParam.class

width=250 height=300>

<param name = bNumber value = 4>

<param name = state value = true>

</applet> </body> </html>

Тогда для чтения и обработки параметров bNumber и state апплет должен выглядеть следующим образом:

/* пример # 5: передача параметров апплету: ReadParam.java */

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import java.applet.Applet;

public class ReadParam extends Applet {

private int bNum;

private boolean state;

 

public void start() { // чтение параметров

String param;

param = getParameter("state");

if (param!= null)

state = new Boolean(param);

try {

param = getParameter("bNumber");

if (param!= null)

bNum = Integer.parseInt(param);

} catch (NumberFormatException e) {

bNum = 0;

state = false;

}

}

public void paint(Graphics g) {

double d = 0;

if (state) d = Math.pow(bNum, 2);

else g.drawString("Error Parameter", 0, 11);

g.drawString("Statement: " + state, 0, 28);

g.drawString("Value b: " + bNum, 0, 45);

g.drawString("b power 2: " + d, 0, 62);

}

}

Рис. 11.5. Передача параметров в апплет

Если параметр недоступен, метод getParameter() возвращает null.

При применении управляющих компонентов в апплетах принято использовать классы из пакета javax.swing, в которых компонент на экране создается средствами Java и в минимальной степени зависит от платформы и оборудования. Такими классами-компонентами являются JButton, JCheckBox, JDialog, JMenu, JComboBox, JMenu, JTextField, JTextArea и другие. Компоненты, как правило, размещают в контейнер (класс Container), являющийся неявным объектом любого графического приложения. Явную ссылку на контейнер можно получить с помощью метода getContentPane().

// пример # 6: апплет с компонентом: MyJApplet.java

package chapt11;

import java.awt.Container;

import javax.swing.JApplet;

import javax.swing.JLabel;

 

public class MyJApplet extends JApplet {

private JLabel lbl = new JLabel("Swing-applet!");

 

public void init() {

Container c = getContentPane();

c.add(lbl);

}

}

Рис. 11.6. Апплет с меткой

В этой программе производится помещение текстовой метки JLabel на форму в апплете. Конструктор класса JLabel принимает объект String и использует его значение для создания метки. Автоматически вызываемый при загрузке апплета метод init() обычно отвечает за инициализацию полей и размещение компонента на форму. Для этого вызывается метод add() класса Container, который помещает компонент в контейнер. Метод add() сразу не вызывается, как можно сделать в библиотеке AWT. Пакет Swing требует, чтобы все компоненты добавлялись в "панель содержания" формы ContentPane, так что требуется сначала вызывать метод getContentPane() класса JApplet для создания ссылки на объект, как часть процесса add().

// пример # 7: жизненный цикл апплета: DemoLC.java

package chapt11;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JApplet;

 

public class DemoLC extends JApplet {

private int starX[] =

{ 112, 87, 6, 71, 47, 112, 176, 151, 215, 136 };

 

private int starY[] =

{ 0, 76, 76, 124, 200, 152, 200, 124, 76, 76 };

 

private int i;

private Color c;

 

public void init() {

c = new Color(0, 0, 255);

setBackground(Color.LIGHT_GRAY);

i = 1;

}

public void start() {

int j = i * 25;

if (j < 255)

c = new Color(j, j, 255 - j);

else i = 1;

}

public void paint(Graphics g) {

g.setColor(c);

g.fillPolygon(starX, starY, starX.length);

g.setColor(Color.BLACK);

g.drawPolygon(starX, starY, starX.length);

}

public void stop() {

i++;

}

}

Рис. 11.7. Цвет полигона и жизненный цикл апплета

При работе со шрифтами можно узнать, какие из них доступны на компьютере, и использовать их. Для получения этой информации применяется метод getAvailableFontFamilyNames() класса GraphicsEnvironment. Метод возвращает массив строк, содержащий имена всех доступных семейств шрифтов, зарегистрированных на данном компьютере.

// пример # 8: доступ к шрифтам ОС: Fonts.java

package chapt11;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.GraphicsEnvironment;

import javax.swing.JApplet;

 

public class Fonts extends JApplet {

private String[] fonts;

 

public void init() {

GraphicsEnvironment ge =

GraphicsEnvironment.getLocalGraphicsEnvironment();

 

fonts = ge.getAvailableFontFamilyNames();

setSize(700, 400);

}

public void paint(Graphics g) {

int xSize = getWidth() / 170;

for (int i = 0; i < fonts.length; i++) {

g.setFont(new Font(

fonts[i], Font.PLAIN, 12)); // название, стиль, размер

g.drawString(fonts[i],

170 * (i % xSize), 13 * (i / xSize + 1));

}

}

}

Рис. 11.8. Вывод списка шрифтов

Фреймы

В Java окно верхнего уровня (не содержащееся в другом окне) называется фреймом. В отличие от апплетов графические приложения, расширяющие класс java.awt.Frame или его подкласс jawax.swing.JFrame, не нуждаются в браузере. Для создания графического интерфейса приложения необходимо предоставить ему в качестве окна для вывода объект Frame или JFrame, в который будут помещаться используемые приложением компоненты GUI (Graphics User Interface). Большинство своих методов класс Frame наследует по иерархии от классов Component, Container и Window. Класс JFrame из библиотеки Swing является подклассом класса Frame.

Такое приложение запускается с помощью метода main() и само отвечает за свое отображение в окне Frame или JFrame.

/* пример # 9:простейший фрейм – овалы и дуги: FrameDemo.java */

package chapt11;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import javax.swing.JFrame;

public class FrameDemo extends JFrame {

private String msg = "My Windows-Application";

 

public void paint(Graphics g) {

int diam = 230;

drawSphere(g, diam);

g.drawString(msg, 59, diam + 52);

g.drawLine(59, diam + 56, 190, diam + 56);

}

public void drawSphere(Graphics g, int diam) {

int r = diam / 2;

int alpha = 0;

int k = 20;

for (int i = 0; i < 4; i++) {

int width = (int) (r * Math.cos(Math.PI / 180 * alpha));

int height = (int) (r * Math.sin(Math.PI / 180 * alpha));

g.setColor(Color.MAGENTA);

g.drawArc(10 + r - width, r + height + i * 10,

2 * width, 80 - i * 20, 0, 180);

g.drawArc(10 + r - width, r - height + i * 10,

2 * width, 80 - i * 20, 0, 180);

g.setColor(Color.BLACK);

g.drawArc(10 + r - width, r + height + i * 10,

2 * width, 80 - i * 20, 0, -180);

g.drawArc(10 + r - width, r - height + i * 10,

2 * width, 80 - i * 20, 0, -180);

alpha += k;

k -= 1;

}

for (int i = 0; i < 4; i++) {

k = (i * i * 17);

g.drawOval(10 + k / 2, 40, diam - k, diam);

}

}

public static void main(String[] args) {

FrameDemo fr = new FrameDemo();

fr.setBackground(Color.LIGHT_GRAY);

// устанавливается размер окна. Желательно!

fr.setSize(new Dimension(250, 300));

// заголовок

fr.setTitle("Windows-Application");

// установка видимости. Обязательно!

fr.setVisible(true);

// перерисовка - вызов paint()

fr.repaint();

}

}

Рис. 11.9. Простейшее графическое приложение

Метод main() вызывает методы установки параметров окна и метод перерисовки окна repaint(). Фреймы активно используются для создания распределенных систем, эксплуатируемых в локальных и закрытых сетях.

Задания к главе 11

В следующих заданиях выполнить рисунок в окне апплета или фрейма.

1. Создать классы Point и Line. Объявить массив из n объектов класса Point. Для объекта класса Line определить, какие из объектов Point лежат на одной стороне от прямой линии и какие на другой. Реализовать ввод данных для объекта Line и случайное задание данных для объекта Point.

2. Создать классы Point и Line. Объявить массив из n объектов класса Point и определить в методе, какая из точек находится дальше всех от прямой линии.

3. Создать класс Triangle и класс Point. Объявить массив из n объектов класса Point, написать функцию, определяющую, какая из точек лежит внутри, а какая – снаружи треугольника.

4. Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющую, какая из точек лежит снаружи, а какая – внутри прямоугольника.

5. Реализовать полиморфизм на основе абстрактного класса AnyFigure и его методов. Вывести координаты точки, треугольника, тетраэдра.

6. Определить класс Line для прямых линий, проходящих через точки A(x1, y1) и B(x2, y2). Создать массив объектов класса Line. Определить, используя функции, какие из прямых линий пересекаются, а какие совпадают. Нарисовать все пересекающиеся прямые.

7. Определить классы Triangle и NAngle. Определить, какой из
m-введенных n-угольников имеет наибольшую площадь:

.

8. Задать движение по экрану строк (одна за другой) из массива строк. Направление движения по апплету и значение каждой строки выбираются случайным образом.

9. Задать составление строки из символов, появляющихся из разных углов апплета и выстраивающихся друг за другом. Процесс должен циклически повторяться.

10. Задать движение окружности по апплету так, чтобы при касании границы окружность отражалась от нее с эффектом упругого сжатия.

11. Изобразить в апплете приближающийся издали шар, удаляющийся шар. Шар должен двигаться с постоянной скоростью.

12. Изобразить в окне приложения (апплета) отрезок, вращающийся
в плоскости экрана вокруг одной из своих концевых точек. Цвет прямой должен изменяться при переходе от одного положения к другому.

13. Изобразить в окне приложения (апплета) отрезок, вращающийся
в плоскости фрейма вокруг точки, движущейся по отрезку.

14. Изобразить четырехугольник, вращающийся в плоскости апплета вокруг своего центра тяжести.

15. Изобразить прямоугольник, вращающийся в плоскости фрейма вокруг одной из своих вершин.

16. Изобразить разносторонний треугольник, вращающийся в плоскости апплета вокруг своего центра тяжести.

Тестовые задания к главе 11

Вопрос 11.1.

Дан код:

<applet code=MyApplet.class width=200 height=200>

<param name=count value=5>

</applet>

Какой код читает параметр count в переменную i?

1) int i = new
Integer(getParameter("count")).intValue();

2) int i = getIntParameter("count");

3) int i = getParameter("count");

4) int i = new Integer(

getIntParameter("count")).intValue();

5) int i = new Integer(getParameter("count"));.

Вопрос 11.2.

В пользовательском методе show() был изменен цвет фона апплета. Какой метод должен быть вызван, чтобы это было визуализировано?

1) setbgcolor();

2) draw();

3) start();

4) repaint();

5) setColor().

Вопрос 11.3.

Какие из следующих классов наследуются от класса Container?

1) Window;

2) List;

3) Choice;

4) Component;

5) Panel;

6) Applet;

7) MenuComponent.

Вопрос 11.4.

Какие из следующих классов могут быть добавлены к объекту класса Container с использованием его метода add()? (выберите два)

1) Button;

2) CheckboxMenuItem;

3) Menu;

4) Canvas.

Вопрос 11.5.

Что будет результатом компиляции и выполнения следующего кода?

import java.awt.*; class Quest5 { public static void main(String[] args) { Component b = new Button("Кнопка"); System.out.print(((Button) b).getLabel()); } }

1) ничего не будет выведено;

2) кнопка;

3) ошибка компиляции: класс Quest5 должен наследоваться от класса Applet;

4) ошибка компиляции: ссылка на Component не может быть инициализирована объектом Button;

5) ошибка времени выполнения.

 
Глава 12

СОБЫТИЯ

Основные понятия

Обработка любого события (нажатие кнопки, щелчок мышью и др.) состоит в связывании события с методом, его обрабатывающим. Принцип обработки событий, начиная с Java 2, базируется на модели делегирования событий. В этой модели имеется блок прослушивания события (EventListener), который ждет поступления события определенного типа от источника, после чего обрабатывает его и возвращает управление. Источник – это объект, который генерирует событие, если изменяется его внутреннее состояние, например, изменился размер, изменилось значение поля, произведен щелчок мыши по форме или выбор значения из списка. После генерации объект-событие пересылается для обработки зарегистрированному в источнике блоку прослушивания как параметр его методов – обработчиков событий.

Блоки прослушивания Listener представляют собой объекты классов, реализующих интерфейсы прослушивания событий, определенных в пакете java.awt.event. Соответствующие методы, объявленные в используемых интерфейсах, необходимо явно реализовать при создании собственных классов прослушивания. Эти методы и являются обработчиками события. Передаваемый источником блоку прослушивания объект-событие является аргументом обработчика события. Объект класса – блока прослушивания события необходимо зарегистрировать в источнике методом

источник. add Событие Listener( объект_прослушиватель );

После этого объект-прослушиватель (Listener)будет реагировать именно на данное событие и вызывать метод «обработчик события». Такая логика обработки событий позволяет легко отделить интерфейсную часть приложения от функциональной, что считается необходимым при проектировании современных приложений. Удалить слушателя определенного события можно с помощью метода remove Событие Listener().

Источником событий могут являться элементы управления: кнопки (JButton, JCheckbox, JRadioButton), списки, кнопки-меню. События могут генерироваться фреймами и апплетами, как mouse- и key-события. События генерируются окнами при развертке, сворачивании, выходе из окна. Каждый класс-источник определяет один или несколько методов add Событие Listener() или наследует эти методы

Когда событие происходит, все зарегистрированные блоки прослушивания уведомляются и принимают копию объекта события. Таким образом источник вызывает метод-обработчик события, определенный в классе, являющемся блоком прослушивания, и передает методу объект события в качестве параметра. В качестве блоков прослушивания на практике используются внутренние классы. В этом случае в методе, регистрирующем блок прослушивания в качестве параметра, используется объект этого внутреннего класса.

Каждый интерфейс, включаемый в блок прослушивания, наследуется от интерфейса EventListener и предназначен для обработки определенного типа событий. При этом он содержит один или несколько методов, которые всегда принимают объект события в качестве единственного параметра и вызываются в определенных ситуациях. В таблице приведены некоторые интерфейсы и их методы, которые должны быть реализованы в классе прослушивания событий, реализующем соответствующий интерфейс:

Интерфейсы Обработчики события
ActionListener actionPerformed(ActionEvent e)
AdjustmentListener adjustmentValueChanged( AdjustmentEvent e)
ComponentListener componentResized( ComponentEvent e) componentMoved(ComponentEvent e) componentShown(ComponentEvent e) componentHidden(ComponentEvent e)
ContainerListener componentAdded(ContainerEvent e) componentRemoved( ContainerEvent e)
FocusListener focusGained(FocusEvent e) focusLost(FocusEvent e)
ItemListener itemStateChanged(ItemEvent e)
KeyListener keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e)
MouseListener mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e)
MouseMotionListener mouseDragged(MouseEvent e) mouseMoved(MouseEvent e)
TextListener textValueChanged(TextEvent e)
WindowListener windowOpened(WindowEvent e) windowClosing(WindowEvent e) windowClosed(WindowEvent e) windowIconified(WindowEvent e) windowDeiconified(WindowEvent e) windowActivated(WindowEvent e)

Событие, которое генерируется в случае возникновения определенной ситуации и затем передается зарегистрированному блоку прослушивания для обработки, – это объект класса событий. В корне иерархии классов событий находится суперкласс EventObject из пакета java.util. Этот класс содержит два метода: getSource(), возвращающий источник событий, и toString(), возвращающий строчный эквивалент события. Абстрактный класс AWTEvent из пакета java.awt является суперклассом всех AWT-событий, связанных с компонентами. Метод getID() определяет тип события, возникающего вследствие действий пользователя в визуальном приложении. Ниже приведены некоторые из классов событий, производных от AWTEvent, и расположенные в пакете java.awt.event:

ActionEvent – генерируется: при нажатии кнопки; двойном щелчке клавишей мыши по элементам списка; при выборе пункта меню;

AdjustmentEvent – генерируется при изменении полосы прокрутки;

ComponentEvent – генерируется, если компонент скрыт, перемещен, изменен в размере или становится видимым;

FocusEvent – генерируется, если компонент получает или теряет фокус ввода;

TextEvent – генерируется при изменении текстового поля;

ItemEvent – генерируется при выборе элемента из списка.

Класс InputEvent является абстрактным суперклассом событий ввода (для клавиатуры или мыши). События ввода с клавиатуры обрабатывает класс KeyEvent, события мыши – MouseEvent.

Чтобы реализовать методы-обработчики событий, связанных с клавиатурой, необходимо определить три метода, объявленные в интерфейсе KeyListener. При нажатии клавиши генерируется событие со значением KEY_PRESSED. Это приводит к запросу обработчика событий keyPressed(). Когда клавиша отпускается, генерируется событие со значением KEY_RELEASED и выполняется обработчик keyReleased(). Если нажатием клавиши сгенерирован символ, то посылается уведомление о событии со значением KEY_TYPED и вызывается обработчик keyTyped().

Для регистрации события приложение-источник из своего объекта должно вызвать метод addКеуListener(KeyListener el ), регистрирующий блок прослушивания этого события. Здесь el – ссылка на блок прослушивания события.

/* пример # 1: обработка событий клавиатуры: MyKey.java */

package chapt12;

import java.awt.*;

import java.awt.event.*;

import javax.swing.JApplet;

 

public class MyKey extends JApplet {

private String msg = " ";

private int x = 0, y = 20; // координаты вывода

 

private class AppletKeyListener

implements KeyListener {

// реализация всех трех методов интерфейса KeyListener

public void keyPressed(KeyEvent e) {

showStatus ("Key Down");

} // отображение в строке состояния

public void keyReleased(KeyEvent e) {

showStatus("Key Up");

} // отображение в строке состояния

public void keyTyped(KeyEvent e) {

msg += e.getKeyChar();

repaint(); // перерисовать

}

}

public void init() {

/* регистрация блока прослушивания */

addKeyListener(new AppletKeyListener());

requestFocus(); // запрос фокуса ввода

}

public void paint(Graphics g) {

// значение клавиши в позиции вывода

g.drawString(msg, x, y);

}

}

Рис. 12.1. Результат нажатия клавиши отображен в строке состояния

Коды специальных клавиш (перемещение курсора, функциональных клавиш) недоступны через keyTyped(), для обработки нажатия этих клавиш исполь­зуется метод keyPressed().

В качестве блока прослушивания в методе init() зарегистрирован внутренний класс AppletKeyListener. Затем в блоке прослушивания реализова­ны все три метода обработки события, объявленные в интерфейсе KeyListener.

В следующем апплете проверяется принадлежность прямоугольнику координат нажатия клавиши мыши с помощью реализации интерфейса MouseListener и события MouseEvent.

/* пример # 2: события нажатия клавиши мыши: MyRect.java */

package chapt12;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class MyRect extends JApplet {

private Rectangle rect =

new Rectangle(20, 20, 100, 60);

private class AppletMouseListener //блок обработки событий

implements MouseListener {

/* реализация всех пяти методов интерфейса MouseListener */

public void mouseClicked(MouseEvent me) {

int x = me.getX();

int y = me.getY();

if (rect.contains(x, y)) {

showStatus(

"клик в синем прямоугольнике");

} else {

showStatus("клик в белом фоне");

}

}

// реализация остальных методов интрефейса пустая

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {}

public void mouseReleased(MouseEvent e) {}

}

public void init() {

setBackground(Color. WHITE);

/* регистрация блока прослушивания */

addMouseListener(new AppletMouseListener());

}

public void paint(Graphics g) {

g.setColor(Color. BLUE);

g.fillRect(rect.x, rect.y,

rect.width, rect.height);

}

}

Рис. 12.2. Результат нажатия кнопки отображен в строке состояния

Способ обработки событий в компонентах Swing - это интерфейс (графические компоненты) и реализация (код обработчика события, который запускается при возникновении события). Каждое событие содержит сообщение, которое может быть обработано в разделе реализации.

При использовании компонента JButton определяется событие, связанное с нажатием кнопки. Для регистрации заинтересованности блока прослушивания в этом событии вызывается метод addActionListener() объектом класса JButton. Интерфейс ActionListener содержит единственный метод actionPerformed(), который нужно реализовать в блоке обработки в соответствии с поставленной задачей: извлечь числа из двух текстовых полей, сложить их и поместить результат в метку.

/* пример # 3: регистрация, генерация и обработка ActionEvent:

SimpleButtonAction.java */

package chapt12;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

 

public class SimpleButtonAction extends JApplet {

private JButton additionBtn = new JButton("Сложить");

private JTextField txtField1 = new JTextField(3);

private JTextField txtField2 = new JTextField(3);

private JLabel answer = new JLabel();

 

private class ButtonListener

implements ActionListener {

// реализация класса- обработчика события

public void actionPerformed(ActionEvent ev) {

try {

int t1, t2;

t1 = Integer. parseInt (txtField1.getText());

t2 = Integer. parseInt (txtField2.getText());

answer.setText("Ответ: " + (t1 + t2));

showStatus("Выполнено успешно!");

} catch (NumberFormatException e) {

showStatus("Ошибка ввода!");

}

/*

* String s1, s2; извлечение надписи на кнопке из события

* s1 = ((JButton)ev.getSource()).getText();

*/

// извлечение команды из события

// s2 = ev.getActionCommand();

/*

* извлечение из события объекта, ассоциированного с кнопкой

* if (ev.getSource() == additionBtn)

* применяется если обрабатываются

* события нескольких кнопок одним обработчиком

*/

}

}

public void init() {

Container c = getContentPane();

setLayout(new FlowLayout()); /* «плавающее»

размещение компонентов*/

c.add(txtField1);

c.add(txtField2);

// регистрация блока прослушивания события

additionBtn.addActionListener(

new ButtonListener());

c.add(additionBtn);

c.add(answer);

}

}

Рис. 12.3. Обработка события кнопки

При создании кнопки вызывается конструктор JButton со строкой, которую нужно поместить на кнопке. JButton - это компонент, который автоматически заботится о своей перерисовке. Размещение кнопки на форме обычно производится внутри метода init() вызовом метода add() класса Container.

Классы-адаптеры

Реализация всех методов–обработчиков событий, объявленных в интерфейсах, не всегда необходима. Чтобы не реализовывать все методы из соответствующих интерфейсов при создании классов – блоков прослушивания событий, используются классы-адаптеры. Такой класссодержит пустую реализацию всех методов из интерфейсов прослушивания событий, которые он расширяет. При этом определяется новый класс – блок прослушивания событий, который расширяет один из имеющихся адаптеров и реализует только те события, которые требуется обрабатывать.

Например, класс MouseMotionAdapter имеет два метода:
mouseDragged()
и mouseMoved(). Сигнатуры этих пустых методов точно такие же, как в интерфейсе MouseMotionListener. Если существует заинтересованность только в событиях перетаскивания мыши, то можно просто расширить адаптер MouseMotionAdapter и переопределить метод mouseDragged() в своем классе. Событие же перемещения мыши обрабатывала бы реализация метода mouseMoved(), которую можно оставить пустой.

Рассмотрим события, возникающие в приложениях, связанных с консольным или графическим окнами. Когда происходит событие, связанное с окном, вызываются обработчики событий, определенные для этого окна. При создании оконного приложения используется метод main(), создающий для него окно верхнего уровня. После этого программа будет функционировать как приложение GUI, а не консольная программа. Программа поддерживается в работоспособном состоянии, пока не закрыто окно.

Для создания графического интерфейса потребуется предоставить место (окно), в котором он будет отображаться. Если программа является приложением, подобные действия она должна выполнять самостоятельно. В самом общем смысле окно является контейнером, т.е. областью, на которой рисуется пользовательский интерфейс. Графический контекст инкапсулирован в классе и доступен двумя способами:

· при переопределении методов paint() и update();

· через возвращаемое значение метода getGraphics() класса Component.

Событие FocusEvent предупреждает программу, что компонент получил или потерял фокус ввода. Событие WindowEvent извещает программу, что был активизирован один из системных элементов управления окна.

В следующем примере реализован простейший графический редактор, позволяющий выбрать цвет и рисовать пером в поле приложения. Приложение создает объект PaintEditor и передает ему управление сразу же в методе main(). Выбор цвета осуществляется с помощью объекта класса JColorChooser.

/* пример # 4: применение адаптеров: PaintEditor.java */

package chapt12;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class PaintEditor extends JFrame {

private int prevX, prevY;

private Color color = Color. BLACK;

private JButton jButton =

new JButton("ColorChooser");

 

public PaintEditor() {

Container c = getContentPane();

c.setLayout(new FlowLayout());

c.add(jButton);

 

jButton.addActionListener(

new ButtonActionListener());

addMouseListener(new PaintMouseAdapter());

addMouseMotionListener(

new PaintMouseMotionAdapter());

}

private class ButtonActionListener

implements ActionListener {

public void actionPerformed(ActionEvent e) {

color = JColorChooser.

showDialog (((Component) e.getSource())

.getParent(), "Demo", color);

}

}

private class PaintMouseAdapter extends MouseAdapter{

public void mousePressed(MouseEvent ev) {

setPreviousCoordinates(

ev.getX(), ev.getY());

}

}

private class PaintMouseMotionAdapter

extends MouseMotionAdapter {

public void mouseDragged(MouseEvent ev) {

Graphics g = getGraphics();

g.setColor(color);

g.drawLine(

prevX, prevY, ev.getX(), ev.getY());

setPreviousCoordinates(

ev.getX(), ev.getY());

}

}

public void setPreviousCoordinates(

int aPrevX, int aPrevY) {

prevX = aPrevX;

prevY = aPrevY;

}

public static void main(String[] args) {

PaintEditor pe = new PaintEditor();

pe.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent ev) {

System. exit (0);

}

});

pe.setBounds(200, 100, 300, 200);

pe.setTitle("MicroPaint");

pe.setVisible(true);

}

}






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных