ИСРПО. ПР7 Создание аплета. Создание аплета
Скачать 143.5 Kb.
|
Лабораторная работа №7 Тема : Создание аплета. Цель : Знакомство с элементами разработки Java-апплетов. Оборудование: ПК, операционная система Windows. Инструктаж по ТБ при работе с ПК. Методические рекомендации. Лабораторная работа направлена на приобретение навыка создания апплетов, их инициализации и запуска как из среды разработки (Eclipse, http://eclipse.org), так и с помощью инструмента разработчика appletviewer. В работе предусмотрено рассмотрение базовых библиотекJava, которые являются неотъемлемой частью языка и входят в его спецификацию, а именно описывается пакет java.awt, предоставляющий технологию AWT (Abstract Window Toolkit- пакет (библиотека) базовых компонентов графического интерфейса пользователя) для создания графического интерфейса пользователя – GUI. Требования к результатам выполнения лабораторного практикума: при выполнении задания необходимо сопровождать все реализованные процедуры и функции набором тестовых входных и выходных данных и описаниями к ним; компиляцию, запуск программ выполнять различными способами; по завершении выполнения задания составить отчет о проделанной работе. При составлении и оформлении отчета следует придерживаться рекомендаций, представленных на следующей странице: http://unesco.kemsu.ru/student/rule/rule.html. Теоретический материал Апплеты (applets)- программы, работающие в среде другой программы — браузера. Апплеты не нуждаются в окне верхнего уровня — им служит окно браузера. Они не запускаются JVM — их загружает браузер, который сам запускает JVM для их выполнения. С точки зрения языка Java, апплет — это всякое расширение класса Applet, который, в свою очередь, расширяет класс panel. Таким образом, апплет — это панель специального вида, контейнер для размещения компонентов с дополнительными свойствами и методами. Менеджером размещения компонентов по умолчанию, как и в классе Panel, служит FiowLayout. Класс Applet находится в пакете java. applet, в котором кроме него есть только три интерфейса, реализованные в браузере. Не все браузеры реализуют эти интерфейсы полностью. Поскольку JVM не запускает апплет, отпадает необходимость в методе main (), его нет в апплетах. В апплетах редко встречается конструктор. Дело в том, что при запуске первого создается его контекст. Во время выполнения конструктора контекст еще не сформирован, поэтому не все начальные значения удается определить в конструкторе. Начальные действия, обычно выполняемые в конструкторе и методе main(), в апплете записываются в метод init() класса Applet, который автоматически запускается исполняющей системой Java браузера после загрузки апплета. Его вид в исходном коде класса Applet: public void init(){} Метод init () не имеет аргументов, не возвращает значения и должен переопределяться в каждом апплете — подклассе класса Applet. Обратные действия — завершение работы, освобождение ресурсов — записываются при необходимости в метод destroy(), тоже выполняющийся автоматически при выгрузке апплета. Кроме методов init() и destroy() в классе Applet присутствуют еще два пустых метода, выполняющихся автоматически. Браузер должен обращаться к методу start() при каждом появлении апплета на экране и обращаться к методу stop(), когда апплет уходит с экрана. В методе stop() можно определить действия, приостанавливающие работу апплета в методе, start()возобновляющие ее. Надо сразу же заметить, что не все браузеры обращаются к этим методам как должно. Метод paint(Graphicsg) вызывается каждый раз при повреждении апплета. AWT следит за состоянием окон в системе и замечает такие случаи, как, например, перекрытие окна апплета другим окном. В таких случаях, после того, как апплет снова оказывается видимым, для восстановления его изображения вызывается метод paint(Graphicsg). Перерисовка содержимого апплета выполняется методом update(). Для инициации update() предусмотрены несколько вариантов метода repaint: repaint(); repaint(time); repaint(x, y, w, h); repaint(time, x, y, w, h); Приведем пример простого апплета, выводящего текст на экран. Программа 1 . Простейший апплет. import java.awt.*; import java.applet.*; public class My_Applet extends Applet{ public void paint(Graphics g){ g.drawString("Hello, World!", 5, 30); } } В отличие от обычных приложений Java, в апплетах инициализация и добавление компонентов графического интерфейса пользователя осуществляется не в конструкторе, а в методе init(). Класс Component. GUI всегда собирается из готовых строительных блоков, хранящихся в библиотеках. В Java их называют общим термином компонент (component), поскольку все они являются подклассами java.awt.Component. Он является базовым для всех компонентов AWT и описывает их основные свойства. Визуальный компонент в AWT имеет прямоугольную форму, может быть отображен на экране и может взаимодействовать с пользователем [1]. Рассмотрим основные свойства этого класса: Положение компонента описывается двумя целыми числами (тип int) x и y. В Java ось x проходит горизонтально, направлена вправо, а ось у – вертикально, но направлена вниз, Для описания положения компонента предназначен специальный класс – Point(точка). В этом классе определено два publicint поля x и y, а также множество конструкторов и вспомогательных методов для работы с ними. Для компонента эта точка задает положение левого верхнего угла. Установить положение компонента можно с помощью метода setLocation(), который может принимать в качестве аргументов пару целых чисел, либо Point. Узнать текущее положение можно с помощью метода getLocation(), возвращающего Point, либо с помощью методов getX() и getY() . Размер описывается также двумя целочисленными параметрами – width(ширина) и height(высота). Для описания размера существует специальный класс Dimension(размер), в котором определено два publicint поля width и height, а также вспомогательные методы. Установить размер компонента можно с помощью метода setSize, который может принимать в качестве аргументов пару целых чисел, либо Dimension. Узнать текущие размеры можно с помощью метода getSize(), возвращающего Dimension, либо с помощью методов getWidth() и getHeight(). Совместно положение и размер компонента задают его границы. Область, занимаемую компонентом, можно описать либо четырьмя числами ( x, y, width, height ), либо экземплярами классов Point и Dimension, либо специальным классом Rectangle. Задать границу объекта можно с помощью метода setBounds, который может принимать четыре числа, либо Rectangle. Узнать текущее значение можно с помощью метода getBounds(). Видимость. Это свойство описывается булевским параметром visible. Методы для управления – setVisible, принимающий булевский параметр, и isVisible, возвращающий текущее значение. Доступность. Компонент отображается на экране и виден пользователю, он может не взаимодействовать с ним ( disabled). Если же компонент активен, его называют enabled. Для изменения этого свойства применяется метод setEnabled, принимающий булевский параметр (true соответствует enabled, false –disabled ), а для получения текущего значения –isEnabled. Цвета. Компонент обладает двумя свойствами, описывающими цвета, – foregroundи backgroundцвета. Первое свойство задает, каким цветом выводить надписи, рисовать линии и т.д. Второе – задает цвет фона, которым закрашивается вся область. Для задания цвета в AWT используется специальный класс Color. Цвет задается 3 целочисленными характеристиками, соответствующими модели RGB, – красный, зеленый, синий. Каждая из них может иметь значение от 0 до 255 (тем не менее, их тип определен как int). В результате (0, 0, 0) соответствует черному, а (255, 255, 255) – белому. Класс Color является неизменяемым, то есть, создав экземпляр, соответствующий какому-либо цвету, изменить параметры RGB уже невозможно. Это позволяет объявить в классе Color ряд констант, описывающих базовые цвета: белый, черный, красный, желтый и так далее. Например, вместо того, чтобы задавать синий цвет числовыми параметрами (0, 0, 255), можно воспользоваться константами Color.blue или Color.BLUE. Класс ContainerКонтейнер описывается классом Container, который является наследником Component. Основная задача – группировать другие компоненты. Для добавления служит метод add, для удаления – remove и removeAll (последний удаляет все компоненты). Добавляемые компоненты хранятся в упорядоченном списке, поэтому для удаления можно указать либо ссылку на компонент, который и будет удален, либо его порядковый номер в контейнере. Также определены методы для получения компонент в контейнере: getComponent(int n) – возвращает компонент с указанным порядковым номером; getComponents() – возвращает все компоненты в виде массива; getComponentCount() – возвращает количество компонент; getComponentAt(intx, inty) или ( Pointp ) – возвращает компонент, который включает в себя указаннуюточку; findComponentAt(intx, inty) или ( Pointp ) – возвращает видимый компонент, включающий в себя указаннуюточку. Положение компонента (location) задается координатами левого верхнего угла. Если расположение компонента на экране не зависит от контейнера, можно воспользоваться методом getLocationOnScreen. Алгоритм отрисовки компонентаМетод paint вызывается, когда необходимо отобразить компонент на экране. У него есть один аргумент, тип которого – абстрактный класс Graphics. В этом классе определено множество методов для отрисовки простейших графических элементов – линий, прямоугольников и многоугольников, окружностей и овалов, текста, картинок и т.д. Наследники класса Component переопределяют метод paint и, пользуясь методами Graphics, задают алгоритм прорисовки своего внешнего вида: public void paint(Graphics g) { g.drawLine(0, 0, getWidth(), getHeight()); g.drawLine(0, getHeight(), getWidth(), 0); } Ключевым классом является Graphics. Методы классаGraphics. drawLine(x1, y1, x2, y2)- отображает линию толщиной в 1 пиксел, проходящую из точки (x1, y1) в (x2, y2). drawRect(int x, int y, int width, int height)-отображает прямоугольник: левый верхний угол в точке(x,y), а ширина и высота width и height. Правая сторона пройдет по линии x+width, а нижняя – y+height. fillRect(int x, int y, int width, int height)- закрашивает прямоугольник. Левая и правая стороны прямоугольника проходят по линиям x и x+width-1 соответственно, а верхняя и нижняя – y и y+height-1 соответственно. Чтобы зарисовать все пикселы компонента, необходимо передать аргументы: g.fillRect(0, 0, getWidth(), getHeight()); drawOval(int x, int y, int width, int height)- рисует овал, вписанный в прямоугольник, задаваемый указанными параметрами. fillOval(int x, int y, int width, int height)- закрашивает указанный овал. drawArc(int x, int y, int width, int height, intstartAngle, intarcAngle)- рисует дугу – часть овала, задаваемого параметрами: наччало с угла startAngle, угловой размер arcAngle. Начальный угол соответствует направлению часовой стрелки, указывающей на 3 часа. Угловой размер отсчитывается против часовой стрелки. fillArc(int x, int y, int width, int height, intstartAngle, intarcAngle)- закрашивает сектор, ограниченный дугой, задаваемой параметрами. drawString(String text, int x, int y)- выводит на экран текст. Точка (x, y) задает позицию самого левого символа, например: g.drawString("abcdefgh", 15, 15); g.drawLine(15, 15, 115, 15); Методы repaint и updateДля программной инициализации перерисовки компонента служит метод repaint. У него нет аргумента типа Graphics, поскольку программист не должен создавать экземпляры этого класса. Метод repaint можно вызывать без аргументов. В этом случае компонент будет перерисован максимально быстро. Можно указать аргумент типа long – количество миллисекунд. Система инициализирует перерисовку спустя указанное время. Можно указать четыре числа типа int( x, y, width, height ), задавая прямоугольную область компонента, которая нуждается в перерисовке. Если перерисовка инициируется приложением, то система вызывает не метод paint, а метод update. У него уже есть аргумент типа Graphics и по умолчанию он лишь закрашивает всю область компонента фоновым цветом (свойство background), а затем вызывает метод paint. Зачем же было вводить этот дополнительный метод, если можно было сразу вызвать paint? Дело в том, что поскольку перерисовка инициируется приложением, для сложных компонентов становится возможной некоторая оптимизация обновления внешнего вида. Например, если изменение заключается в появлении нового графического элемента, то можно избежать повторной перерисовки остальных элементов – переопределить метод update и реализовать в нем отображение одного только нового элемента. Если же компонент имеет простую структуру, можно оставить метод update без изменений. Задания к работе 1. Выполните программу import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.applet.*; public class My_Applet extends Applet{ public void init(){ setLayout(null); final TextField tf1 = new TextField(15); tf1.setBounds(1, 1, 100, 20); add(tf1); final TextField tf2 = new TextField(15); tf2.setBounds(1, 25, 100, 20); add(tf2); final TextField tf3 = new TextField(15); tf3.setBounds(1, 50, 100, 20); add(tf3); Button b1 = new Button("Кнопка 1"); b1.setBounds(1, 100, 100, 20); add(b1); b1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ try{ tf3.setText(String.valueOf((Long.valueOf(tf1.getText()) +Long.valueOf(tf2.getText())))); }catch(Exception e){ tf3.setText("Введите числа"); } } }); } } Поясните назначение и принцип действия аплета, описанного в программе. 2. Выполните задание 1 из лабораторной работы №7 в форме апплета. 3. Создайте апплет, в котором при нажатии на кнопку выводится матрица 3х3. Используйте метод drawString(). В данной программе описан апплет, в котором расположены три текстовых поля и одна кнопка. При нажатии на кнопку введенные численные значения первых двух полей складываются и результат записывается в третье . |