
- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •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-приложение
3. Поведение контейнера при наличии элементов управления
При использовании в контейнере элементов управления в поведении контейнера возникают некоторые странности.
Во-первых, при попадании указателя мыши на элементы управления возникает событие MOUSE_EXIT, а при переводе указателя назад в окно контейнера следует событие MOUSE_ENTER. Вывод: области, занятые элементами интерфейса, исключаются из окна контейнера, и события от мыши в этих областях не обрабатываются.
Во-вторых, не происходит ни одного вызова обработчиков нажатий и отпусканий клавиш клавиатуры. Это говорит о том, что контейнера не имеет фокуса ввода. Нет фокуса и у элементов интерфейса. Если нажать клавишу <Tab>, то передачи фокуса не происходит. Вывод: после создания контейнера фокуса ввода нет ни у одного элемента интерфейса.
Если необходимо, чтобы нажатия клавиш отслеживались аплетом, нужно сделать так, чтобы аплет получил фокус. Для получения фокуса ввода этого для контейнера нужно вызвать метод requestFocus().
Если, например, в методе init() в апплет ввести несколько элементов управления, и затем для апплета вызвать метод requestFocus(), тогда при нажатии на кнопки клавиатуры обработчики нажатий и отпусканий клавиш начнут вызываться. Если нажать клавишу <Tab>, фокус ввода перейдет к кнопке. При этом также вызываются обработчики lostFocus() и gotFocus(), отмечающие потерю фокуса ввода одним элементом и получение его другим.
4. Приложение PanelsDemo1
Задание. Создать апплет двойного назначения PanelsDemo1, в окне которого создаются две панели, расположенные горизонтально (для окна апплета используется менеджер размещения GridLayout). Первая из панелей используется как «блокнот», на каждой странице которого находится кнопка (всего 3 «страницы», панель использует менеджер размещения CardLayout). Вторая панель содержит две управляющие кнопки «Previous» и «Next», позволяющие перебирать страницы «блокнота» по очереди. При нажатии на кнопки первой панели в строке состояния навигатора должно отображаться название нажатой кнопки.
Методические указания. Апплет должен быть создан на основе шаблонов, содержащихся в Приложении 4 (или при помощи системы Java Applet Wizard).
Объявление элементов класса апплета.
В классе апплета объявим следующие элементы - ссылки на объекты классов:
Panel cardPanel, controlPanel;
Button btn1,btn2,btn3,btnPrev,btnNext;
В поле cardPanel будет храниться ссылка на панель «блокнота», страницы которого содержат кнопки. Эта панель будет располагаться в верхней части окна апплета.
Поле controlPanel будет использоваться для хранения ссылки на панель кнопок, предназначенных для перелистывания страниц «блокнота» cardPanel.
Ссылки на кнопки, расположенные на страницах «блокнота», будут сохраняться в полях btn1, btn2 и btn3.
Ссылки на кнопки, предназначенные для перелистывания страниц, будут записываться в поля btnPrev и btnNext.
Инициализация апплета ( метод init()).
В этом методе необходимо создать панели и добавить в них компоненты. Сначала установим желтый (Color.yellow) цвет фона окна апплета методом setBacground(). Затем выберем для окна апплета схему размещения GridLayout (сетка 2х1), используя метод setLayout() апплета.
Создание панелей апплета.
Создадим объекты cardPanel и controlPanel класса Panel. Затем установим для панелей менеджеры размещения (вызывая метод setLayout() для объектов cardPanel и controlPanel): для панели cardPanel - менеджер размещения CardLayout, а для панели controlPanel - менеджер FlowLayout.
Создание кнопок и ввод их на страницы «блокнота».
Создадим кнопки btn1, btn2 и btn3 с надписями "1st button", "2nd button" и "3rd button" соответственно. После создания кнопок добавим их по очереди в панель cardPanel, заполняя страницы «блокнота».
Создание кнопок и ввод их в панель управления.
Создадим кнопки btnPrev и btnNext с надписями "Previous" и " Next " соответственно. После создания кнопок добавим их по очереди в панель controlPanel.
Ввод панелей в апплет. После завершения формирования панелей cardPanel и controlPanel добавим их по очереди в апплет при помощи метода add() аплета.
Отрисовка содержимого окна ( метод paint()).
Так как апплет не выводит в окно никаких графических изображений, то в этом методе не делается никаких действий.
Обработка событий ( метод action()).
Переопределим в класса апплета метод action(), вызываемый при нажатиях на кнопку (и при некоторых других действиях пользователя). В данном случае он будет обрабатывать события, поступающие от кнопок, расположенных в обеих панелях. Сначала создадим шаблон этого метода:
public boolean action(Event evt, Object obj)
{
// обработка событий от кнопок
if(evt.target instanceof Button) // объект является кнопкой?
{ // получаем ссылку на кнопку, вызвавшую событие
Button btn=(Button)evt.target;
// получаем метку кнопки
String lbl=btn.getLabel();
// проверка, от какой именно кнопки пришло событие
// и обработка события от этой кнопки
// ..................................
return true; // если событие обработано, иначе return false
}
// необработанные события передаем на дальнейшую обработку
return false;
}
События от панели cardPanel.
Проверяя, какой именно кнопке равен объект btn, необходимо выполнить следующие действия: при нажатии кнопок btn1, btn2 и btn3 в панели состояния отобразить при помощи функции showStatus() название кнопки, а при нажатии на кнопки btnPrev и btnNext отобразить соответствующую страницу «блокнота». Проверка равенства объекта btn другому объекту осуществляется следующим образом:
if(btn.equals(btn1)) // от кнопки с номером 1?
{ // обработка события от кнопки 1
// .............................
}
События от панели controlPanel.
Если нажата кнопка btnPrev, то сначала с помощью метода getLayout() получаем ссылку на используемый для панели cardPanel менеджер компоновки, а затем вызываем метод previous() для отображения предыдущей страницы панели cardPanel:
CardLayout cl=(CardLayout)cardPanel.getLayout();
cl.previous(cardPanel);
Аналогичные действия сделаем, если нажата кнопка btnNext, но для отображения следующей страницы вызовем метод next() класса CardLayout.