
- •Введение
- •Основы программирования на java Язык программирования Java
- •Базовый синтаксис языка
- •Объектная модель Java
- •Наследование
- •Жизненный цикл объекта
- •Примитивные типы данных
- •Управляющие конструкции
- •Исключительные ситуации
- •Механизм фоновых процессов
- •Класс Thread и интерфейс Runnable
- •Средства синхронизации процессов
- •Принципы построения Java-программы
- •Автоматическое освобождение памяти в Java-программе
- •Java и безопасность
- •Оконный пользовательский интерфейс в Java-программе
- •Основы построения графического пользовательского интерфейса Компоненты и контейнеры
- •Организация интерфейса
- •События
- •Методы класса Component, связанные с обработкой событий
- •Лабораторный практикум Общие указания
- •Лабораторная работа № 1
- •Методические указания.
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Лабораторная работа № 2
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты задания
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Разработать апплет – стрелочный секундомер.Список литературы
Требования к выполнению лабораторной работы
При выполнении лабораторной работы следует изучить наиболее важные классы и интерфейсы, входящие в пакеты java.awt. и java.awt.event Особое внимание следует уделить рассмотрению механизма событийного управления в AWT программе Java. При этом следует использовать не только методические указания к данной лабораторной работе, но и документацию по Java.
Результатом выполнения лабораторной работы должна стать работающая программа на языке Java, обладающая графическим оконным интерфейсом пользователя, основанном на классах AWT.
По результатам работы оформляется отчет, который должен включать в себя:
Формулировку задания.
Описание структуры пользовательского интерфейса
Структура вашей программы в виде диаграммы классов.
Руководство пользователя
Текст программы (приложение)
Варианты задания
В качестве заданий следует использовать варианты из лабораторной работы № 2, дополнив их требованиями о наличии графического пользовательского интерфейса
Лабораторная работа № 4
Цель работы: Изучение основ программирования для Internet с помощью Java. Рассмотрение принципов разработки апплетов на Java. Графика и фоновые процессы в Java.
Методические указания
Java изначально создавался как межплатформенный язык для написания распределенных вычислительных систем и в этой связи в нем определено множество стандартных классов, облегчающих подобное программирования. Из любой программы на Java можно с легкостью установить сетевое соединение с использованием сокетов (класс Socket), связать с этим соединением поток, и получать информацию из сети также легко, как из локального файла.
В связи с постоянным ростом глобальной сети Internet , сетевое программирование на Java в первую очередь предполагает создание ПО для Internet. В Java введено множество дополнительных классов (например URL, URLConnection, и другие) облегчающих такое программирование.
Одним из направлений развития Intenet является расширение сети World Wide Web серверов. Апплеты – это вложенные выполняемые объекты, которые можно передавать через Internet и включать в WWW станицы. Это позволяет сделать WWW более интерактивной.
Апплет является объектом Java. Класс Applet объявлен в пакете java.applet, содержит общую для всех апплетов функциональность, и может служить основой для создания произвольных пользовательских апплетов. Сам класс Applet является наследником класса Container, входящего в java.awt, а, следовательно, любой апплет может использовать оконный пользовательский интерфейс и содержать кнопки, поля ввода и прочие управляющие элементы.
С точки зрения Java, апплет может состоять из одного или нескольких класс-файлов, главным из которых является тот, в котором определен наследник стандартного класса Applet. Именно этот файл указывается в WWW странице, загружается в броузер и запускается на выполнение.
Любой апплет должен реализовывать четыре метода управления своим жизненным циклом: init(), start(), stop() и destroy(). Все эти методы объявлены в классе Applet и вам нужно только переопределить их действие в вашем классе.
Метод init() вызывается единственный раз, при загрузке апплета в броузер. В данный момент апплет еще не видим, и это самое подходящее место для инициализации всех его объектов. Методы start() и stop() связанны с отображением апплета на экране. start() вызывается всякий раз, когда на экране появляется HTML станица, содержащая апплет. Когда апплет убирают с экрана, либо с помощью полосы прокрутки, либо при отображении броузером другой HTML страницы, вызывается метод stop(). Количество вызовов start() и stop() за время жизни апплета может быть произвольным, но stop() всегда вызывается после start(), а первый вызов start() следует после вызова init(). Метод destroy() вызывается один раз и предшествует окончательному завершению работы апплета, например при выходе из программы – броузера. В этом методе следует освободить ресурсы, занятые апплетом при старте, например, закрыть сокеты и уничтожить фоновые задачи, запущенные апплетом. Все вышеперечисленные методы апплета вызываются броузером автоматически.
Так как класс Applet наследован от Component, то ему присуще также методы отображения себя на экране, такие как paint(), update(), repaint(). В методе paint() следует определить информацию, отображаемую вашим апплетом. Вызов repaint() можно осуществлять, если отображаемая информация изменилась.
Общий каркас апплета следующий:
import java.applet.*;class MyApplet extends Applet { public void init () { // действия по инициализации апплета } public void start() { // запуск основного алгоритма апплета } public void stop() { // остановка основного алгоритма } public void destroy () { // остановка алгоритма и действия по уничтожению апплета } public void paint(Graphics g) { // нестандартная отрисовка апплета }}
Для апплета часто бывает необходимо динамически обновлять представляемую им информацию. Можно, конечно, организовать некоторый цикл в апплете, определять время обновления информации и затем отображать ее, однако более эффективно запустить в апплете дополнительную фоновую задачу, которая и будет определять время обновления информации и сообщать об этом апплету. Благодаря встроенной в Java возможности управления фоновыми процессами (задачами) это очень несложно сделать. Класс апплета, который будет запускать фоновую задачу, должен реализовывать интерфейс Runnable, в котором объявлен единственный метод run(). Этот метод будет вызываться всяким фоновым процессом, владельцем которого является данных класс. Сама фоновая задача представлена в Java классом Thread. При создании экземпляра фоновой задачи, конструктор Thread(Runnable) передается ссылка на объект, реализующий интерфейс Runnable, который и является владельцем данной фоновой задачи. Задача запускается вызовом метода start() объекта Thread и останавливается при удалении всех ссылок на данную задачу. Пример кода апплета, использующего подобный механизм для отображения текущего времени, представлен ниже.
class TimerApplet extends Applet implements Runnable { private Thread timer; // ссылка на фоновую задачу public void init() { Font f = new Font ("Arial", Font.BOLD, 15 ); setFont(f); // создать фонт для отображения времени } public void start() { timer = new Thread(this); //новая задача,владелец-апплет timer.start(); } public void stop () { timer = null; } public void run(); { // вызывается задачей timer do { repaint (); // перерисовать апплет try { Thread.currentThread().sleep(1000); // останов timer // ^^^ статический метод класса Thread } catch (InterruptedException e) { break; //задача timer была прервана, выйти из цикла } } while (timer == Thread.currentThread()); //выполнять пока существует timer } public void paint (Graphics g) { g.setFont(getFont());//выбрать шрифт для области рисования FontMetrics fm = g.getFontMetrics(); // параметры фонта Date d = new date(System.currentTimeMillis()); String strTime = d.getHours() + ":"+d.getMinutes()+":"+ d.getSeconds(); //формировать время int cx = fm.stringWidth(strTime);//определить ширину стр. int cy = getSize().height/2; // высота – 0.5 всего апплета g.drawString( strTime, cx, cy); // вывод строки // в область рисования Graphics данного апплета } }
Как уже отмечалось, апплет должен отображать себя с помощью метода paint(Graphics), наследованного от Component. В качестве параметра, передаваемого этому методу, служит объект класса Graphics. Подобный объект представляет собой набор инструментов для рисования и связан с определенным фрагментом на дисплее, куда осуществляется вывод (область апплета). Объект подготавливается автоматически, перед вызовом pain().
В классе Graphics имеются методы, с помощью которых можно выводит текст, рисовать линии, прямоугольники, заполненные многоугольники, овалы, дуги, сектора, различные изображения.
Для вывода текста на экран, следует выбрать для него шрифт. Шрифт представлен в Java как объект класса Font:
Font f new Font("Arial", Font.BOLD, 10); // создать шрифт
При создании указывается имя шрифта (доступного в системе, список возвращает метод string[] Toolkit.getDefaultToolkit().getFontList() ), параметры (утолщенный, наклонный) и размер в пикселах. Фонт устанавливается для объекта Graphics с помощью метода setFont(Font). Для определения параметров строки, выводимой данным шрифтом, следует сначала получить описание параметров шрифта (метрик) в виде класса FontMetrics, например так:
Font f = new Font ("Courier" ,FONT.PLAIN, 10);FontMetrics fm = new FontMetrics (f); //метрики фонта
Далее, следует определить ширину и высоту строки, при ее отображении данным шрифтом:
String str = "Hello!";int width = fm.stringWidth(str); // ширина данной строкиint height = fm.getHeight(); // высота строки текста
После этого, возможен вывод строки средствами объекта класса Graphics:
g.drawString (str, width, height); //вывести
Отображение разнообразных графических фигур выполняется еще проще, чем печать текстов. Для отображения линии, в классе Graphics определен метод drawLine( int x1, int y1, int x2, int y2), параметры которого задают начальную и конечную точку (в пределах объекта Graphics, размеры которого возвращает метод Dimension getSize() ). Изображение прямоугольника осуществляет метод drawRect(int x, int y, int width, int height) , а отображение заполненного прямоугольника осуществляет метод fillRect (), с аналогичными параметрами. Овал отображается методами drawOval() или fillOval(), параметры которых совпадают с таковыми для метода drawRect(). Овал задается описывающим его прямоугольником. Возможно также рисование эллиптических дуг, методами drawArc() и fillArc() , в качестве параметров которых передается прямоугольник, в который вписан овал, начальный угол и разницу между начальным и конечным углом. В классе Graphics также предусмотрен метод вывода произвольного изображения, заданного в виде битового массива (объекта Image). Эту операцию выполняет метод drawImage (Image i, int x, int y, ImageObserver) последний параметр определяет ссылку на объект, контролирующий вывод Image (реализующий интерфейс ImageObserver). Это может быть сам апплет.
Все рисование в Graphics выполняется текущим цветом. Цвет в Java описывается классом Color. При создании цвета, его конструктору передаются параметры, описывающие 3 составляющих создаваемого цвета (red, green, blow)
Color c = new Color (255, 0, 0); // полностью красный
В классе Graphics существуют методы Color getColor() и setColor(Color), для получения текущего цвета и установки нового.
Апплет – это программа на Java, но на апплет накладываются дополнительные ограничения, связанные с обеспечением безопасности. Апплет должен загружаться по сети и запускаться на машине клиента, и в целях безопасности клиентской машины для апплетов запрещена любая запись или чтение файлов на локальных дисках машины – клиента. Запись возможна только на сервер, с которого был запущен апплет, но это требует дополнительного программирования. На сервере должна быть запущена программа, выполняющая запросы апплета на чтение\запись. Получить URL для HTMLфайла, в который встроен апплет (узнать адрес сервера), можно методом getDocumentBase() а получение базового адреса программы (расположение класс-файлов на сервере) с помощью getCodeBase().
Апплет всегда встроен в некоторую HTML страницу, которая загружается в броузер и из которой броузер определяет необходимость загрузки и запуска программы-апплета. Такие страницы пишутся на языке HTML. Для описания апплета существует специальная конструкция HTML:
<APPLET NAME=имя апплета на www странице CODE=имя класса CODEBASE=каталог класс-файлов WIDTH=ширина апплета HEIGHT=высота апплета><PARAM NAME=имя параметра1 VALUE=значение1>.....<PARAM NAME=имя параметраN VALUE=значениеN></APPLET>
Первым в данной конструкции идет тег <APPLET> В него включены следующие параметры: NAME – имя, отображаемое для апплета на www станице. Может использоваться для связи нескольких апплетов между собой. Является необязательным параметром. CODE – имя класса апплета, CODEBASE – необязательный параметр, используется для указания того, где следует искать класс-файлы апплета на сервере. По умолчанию они ищутся в том же каталоге, в котором расположена HTML страница. Параметры WIDTH и HEIGHT определяют соответственно длину и ширину видимой области апплета (в пикселах).
Далее следуют теги параметров апплета. В них описываются имена и значения параметров, которые передаются апплету при запуске. Для получения значения параметра при работе апплета следует использовать метод класса Applet: String getParameter(String) который, по заданной строке – имени параметра, возвращает строку значения этого параметра из HTML текста.
Закрывает описание апплета на HTML странице тег </APPLET>
Ниже представлен пример HTML страницы, содержащей встроенный апплет:
<HTML><HEAD> <TITLE>Applet example</TITLE></HEAD><BODY> <APPLET CODE=MyApplet.class WIDTH=460 HEIGHT=160> <PARAM NAME=pause VALUE=200> <PARAM NAME=text VALUE="HaHa!"> </APPLET></BODY></HTML>