- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •1. Простейшее приложение Hello
- •2. Структура Java-программы
- •2.1 Переменные
- •2.1.1 Примитивные типы
- •2.1.2 Ссылочные типы
- •2.2 Методы
- •2.3 Классы
- •2.3.1 Статические и динамические элементы (модификатор static)
- •2.3.2 Модификаторы доступа
- •2.3.3 Наследование классов
- •2.3.4 Специальные переменные
- •2.4 Пакеты и импортирование
- •2.4.1 Использование пакетов
- •2.4.2 Создание пакетов
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Простейший апплет Hello
- •1.1 Апплет Неllo, управляемый мышью
- •2. Простейший апплет HelloApplet, созданный Java Applet Wizard
- •2.1 Создание шаблона апплета HelloApplet
- •2.2 Исходные файлы апплета HelloApplet
- •2.3 Упрощенный вариант исходного текста апплета HelloApplet
- •3. Аргументы апплета
- •3.1 Передача параметров апплету
- •3.2 Апплет, принимающий параметры
- •3.4 Двойная буферизация графического изображения
- •4. События и их обработка
- •4.1 Обработчики событий от мыши и клавиатуры
- •4.2 Обработка событий
- •4.3 Апплет, обрабатывающий события
- •4.4 Устранение мерцания при выводе, двойная буферизация
- •5. Апплеты двойного назначения
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Рисование в окне
- •1.1 Графика
- •1.2 Цвет
- •1.3 Шрифты
- •1.4 Приложение FontsList
- •2. Обработка событий
- •2.1 Как обрабатываются события
- •2.2 События от мыши
- •2.3 Приложение LinesDraw
- •2.4 События от клавиатуры
- •2.5 Приложение KeyCodes
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Компоненты gui
- •2. Устройства или элементы управления
- •2.1 Кнопки
- •2.2 Флажки (или переключатели)
- •2.3 Меню выбора (или выпадающие списки)
- •2.4 Раскрывающиеся списки
- •2.5 Полосы прокрутки
- •2.6 Метки
- •2.7 Текстовые компоненты
- •3. Приложение AllElements
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Контейнеры
- •1.1 Панели
- •1.2 Окна
- •1.3 Рамки, фреймы
- •2. Менеджеры размещения компонентов
- •2.1 Типы менеджеров размещения
- •3. Поведение контейнера при наличии элементов управления
- •4. Приложение PanelsDemo1
- •5. Приложение PanelsDemo2
- •6. Приложение WindowsDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Процессы, задачи и приоритеты
- •2. Реализация многозадачности в Java
- •2.1 Создание подкласса Thread
- •2.2 Реализация интерфейса Runnable
- •2.3 Применение мультизадачности для анимации
- •2.4 Апплет двойного назначения, реализующий интерфейс Runnable
- •3. Потоки (нити)
- •3.1 Состояние потока
- •3.2 Исключительные ситуации для потоков
- •3.3 Приоритеты потоков
- •3.4 Группы потоков
- •4. Приложение VertScroller
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Автономные приложения. Потоки данных. Работа с локальными файлами (2 часа) методические указания к лабораторной работе
- •1. Самостоятельные графические приложения
- •2. Потоки ввода-вывода в Java
- •2.1. Обзор классов Java для работы с потоками
- •2.2 Стандартные потоки ввода-вывода
- •2.3 Потоки, связанные с локальными файлами
- •2.3.1 Создание потоков, связанных с локальными файлами
- •2.3.2 Запись данных в поток и чтение их из потока
- •2.3.3 Закрытие потоков
- •2.3.4 Принудительный сброс буферов
- •2.3.5 Приложение StreamDemo
- •2.4 Потоки в оперативной памяти
- •3 Работа с локальной файловой система
- •3.1 Работа с файлами и каталогами
- •3.2 Приложение DirList
- •3.3 Произвольный доступ к файлам
- •3.4 Просмотр локальной файловой системы
- •3.5 Приложение FileDialogDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Сетевые приложения: передача данных с использованием сокетов (2 часа)
- •1. Сокеты
- •2. Протокол tcp/ip, адрес ip и класс InetAddress
- •3. Потоковые сокеты
- •3.1 Создание и использование канала передачи данных
- •3.2 Конструкторы и методы класса Socket
- •3.3 Пример использования потоковых сокетов
- •4. Датаграммные сокеты (несвязываемые датаграммы)
- •4.1 Конструкторы и методы класса DatagramSocket
- •4.3 Пример использования датаграммных сокетов
- •5 Приложения ServerSocketApp и ClientSocketApp
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Связь по сети с помощью url (2 часа) методические указания к лабораторной работе
- •1. Универсальный адрес ресурсов url
- •2. Класс java.Net.Url в библиотеке классов Java
- •3. Использование класса java.Net.Url
- •3.1 Чтение из потока класса InputStream, полученного от объекта класса url
- •3.2 Получение содержимого файла, связанного с объектом класса url
- •4. Соединение с помощью объекта класса urlConnection
- •5. Приложение Diagram
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Создание и использование сервлетов (2 часа) методические указания к лабораторной работе
- •1. Как устроен сервлет
- •2. Вспомогательные классы
- •3. Запуск и настройка сервлетов
- •4. Сервлет example, принимающий параметры
- •5. Сервлет, обрабатывающий запросы на основе методов cet и post
- •6. Сервлет MyselfInfo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Работа с базами данных, использование интерфейса jdbc(2 часа) методические указания к лабораторной работе
- •1. Написание апплетов, сервлетов и приложений jdbc
- •1.1 Соединение с базой данных
- •1.2 Применение интерфейса DatabaseMetaData
- •1.3 Посылка статичных sql-запросов
- •1.4 Посылка параметризированных и частовыполняемых sql-запросов
- •1.5 Выборка результатов
- •1.6 Применение интерфейса ResultSetMetaData
- •1.7 Доступ к хранимым функциям и процедурам
- •1.8 Применение выходных параметров
- •2. Обработка исключений jdbc
- •3. Отладка приложений jdbc
- •4. Сервлет, работающий с информацией из базы данных
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Приложение 1 java-файл простейшего апплета и html-документ со ссылкой на него
- •Приложение 2 java-файл апплета, принимающего параметры, и html-документ со ссылкой на него
- •Приложение 3 java-файл апплета, обрабатывающего простые события мыши, и html-документ со ссылкой на него
- •Приложение 4 java-файлы апплета двойного назначения и html-документ со ссылкой на него
- •Приложение 5 java-файлы апплета двойного назначения, обрабатывающего сообщения от мыши, и html-документ со ссылкой на него
- •Приложение 6 java-файл апплета двойного назначения, реализующего интерфейс runnable, и html-документ со ссылкой на него
- •Приложение 7 самостоятельное графическое java-приложение
4.3 Апплет, обрабатывающий события
Создадим апплет MouseEvent (пример 7), отображающий положение курсора мыши с помощью вывода графического изображения в точке. Включение и выключение режим слежения происходит при нажатии на клавишу мыши.
При создании шаблона апплета с помощью системы Java Applet Wizard необходимо в третьей диалоговой панели дать возможность системе сгенерировать заготовки методов-обработчиков нажатия на клавишу и перемещение мыши - в исходный текст апплета будут включены заготовки соответствующих методов-обработчиков. Тексты подобных шаблонных файлов содержатся в Приложении 3 и их можно в дальнейшем использовать в качестве шаблонов апплета, обрабатывающего простые сообщения от мыши.
В каталог, где содержится файл исходного текста, следует поместить файл с изображением arrow.gif
Для хранения состояния класса MouseEvent объявить в классе переменные:
private int m_x=0, m_y=0; // текущее положения курсора
private boolean follow=true; // режим отслеживания включен/выключен
Image imageCur; // переменная для граф. изображения
Для загрузки графического изображения из файла того же каталога, где располагается файл класса MouseEvent, можно использовать следующий фрагмент, помещаемый в метод init() класса MouseEvent:
try
{ imageCur=getImage(new java.net.URL(getCodeBase(),"arrow.gif"));
}
catch(java.net.MalformedURLException e)
{ // код здесь выполняется, если строка URL неправильна
imCur=createImage(0,0); // создание пустого изображения
}
Для прорисовки изображения апплета вызывается метод paint(), его следует переопределить в классе MouseEvent следующим образом:
public void paint(Graphics g)
{ // рамка вокруг окна апплета
Dimension size=size(); // размер компонента (окна апплета)
g.drawRect(0,0,size.width-1,size.height-1);
// прорисовка изображения
g.drawImage(imageCur,m_x,m_y,this)
}
За обработку такого события, как перемещение мыши, отвечает метод mouseMove(). В этом методе необходимо сохранить текущие координаты мыши и перерисовать окно апплета:
public boolean mouseMove(Event evt, int x, int y)
{ if(follow) // если режим отслеживания
{ m_x=x; m_y=y; // сохранение координат
repaint(); // перерисовка окна
}
return true;
}
Режим слежения за курсором включается и выключается при нажатии, поэтому следует изменить метод mouseDown() следующим образом:
public boolean mouseDown(Event evt, int x, int y)
{ follow=!follow;
return true;
}
4.4 Устранение мерцания при выводе, двойная буферизация
При просмотре апплета MouseEvent заметен факт мерцания окна апплета. Этот эффект является результатом усилий апплета перерисовать экран быстрее, чем это технически возможно. Классическим решением такой проблемы является двойная буферизация графического изображения - не осуществлять вывод изображения сразу на экран, а сначала сформировать его полностью в памяти (на виртуальном экране), а затем сразу полностью вывести его в окно.
Когда оболочка времени выполнения должна повторно перерисовывать графические окна - например, когда окно было затенено или когда апплету требуется повторно перерисовать свое окно, - вызывается метод модификации апплета update() и передается объект Graphics графического экрана. Этот метод по умолчанию просто передает полученный объект Graphics методу paint().
Апплет запрашивает перерисовку окна методом repaint(),который в свою очередь как можно скорее вызывает метод модификации update(). Если апплет запрашивает другую перерисовку, прежде чем метод модификации вызвался из первой, апплет модифицируется только в первый раз. Воспользуемся именно эти свойством методом update() для формирования изображения в памяти и вывода его в окно вместо простого разрешения выводить изображение в апплет прямо в окно.
Модифицируем апплет MouseEvent (пример 8), так чтобы эффект мерцания был устранен. В апплете нужно определить ссылки на виртуальный экран и его контекст отображения:
// изображение (виртуальный экран)
private Image OffScreenImage;
// контекст отображения (интерфейс) изображения
private Graphics OffscreenGraphics;
Для создания объектов этих типов добавим следующий фрагмент в метод init() после кода загрузки картинки из файла arrow.gif:
// пустое изображение (виртуальный экран)
OffScreenImage=createImage(size().width,size().height);
// получение контекста отображения для OffScreenImage
OffscreenGraphics=OffScreenImage.getGraphics();
В этом фрагменте создается пустое изображение размером с окно апплета (виртуальный экран). Объект OffscreenGraphics - это контекст для вывода в OffScreenImage. Апплет будет при помощи этого контекста рисовать на виртуальном экране с такой скоростью, с какой только сможет. Метод модификации update(), переопределяемый в апплете выводит изображение на объект Graphics с такой скоростью, с какой только сможет:
public void update(Graphics g)
{ // перерисовать виртуальный экран,
// то есть изображение OffScreenImage
paint(OffscreenGraphics);
// вывести изображение OffScreenImage в окно
g.drawImage(OffScreenImage,0,0,this);
}
Переопределим также и метод paint(), теперь он может, используя передаваемый ему контекст, выводить изображение на виртуальный экран при вызове его из метода update(), когда сам апплет требует перерисовки методом repaint(), так и при вызове его системой тогда, когда для окна требуется перерисовка в связи с его перекрытиями другими окнами:
public void paint(Graphics g)
{
g.setColor(Color.gray);
g.fillRect(0,0,size().width-1,size().height-1);
g.setColor(Color.black);
g.drawRect(0,0,size().width-1,size().height-1);
g.drawImage(imageCur,m_x,m_y,this);
}
