
- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •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-приложение
2. Устройства или элементы управления
Рассмотрим такие компоненты, как элементы управления. При их помощи можно создавать программы, обладающие развитым пользовательским интерфейсом. Язык Java содержит все стандартные элементы управления, которые можно обнаружить в современных компьютерных операционных системах. Элементы управления сначала создаются, затем добавляются в контейнер (объект класса Container) его методом add().
2.1 Кнопки
Кнопки (класс Button) - это устройства, которые дают возможность нажимать на них, чтобы проинициализировать некоторое действие.
Для создания кнопок необходимо в методе класса Container (или его подкласса) просто создать экземпляр объекта Button, дать ему имя и добавить его в контейнер:
Button myButtom=new Button("Click me!");
add(myButton);
или еще проще:
add(new Button("Click me!"));
Следует обратить внимание на то, что при создании кнопки не передаются координаты X, Y ее положения. Это происходит потому, что элементы управления, как и все устройства, размещаются на экране в соответствии с правилами, определяемыми менеджерами компоновки (размещения): при этом координаты не используются. Подробно менеджеры размещения будут рассматриваться в следующей главе.
Создать кнопку можно с заданной меткой (строкой), а можно и без нее. Для этого предназначены соответствующие конструкторы Button() и Button(String label). Для изменения и получения метки кнопки существуют методы setLabel() и getLabel() соответственно.
Обработка событий от кнопки (и от других компонент)
Для обработки событий, создаваемых кнопками, и другими компонентами, можно переопределить метод handleEvent() контейнера, содержащего эти компоненты. Однако существует более простой способ, основанный на переопределении метода action(), который получает управление, когда пользователь совершает какое-либо действие с компонентом (нажатие на кнопку мышью; завершение ввода строки в текстовом поле - нажатие клавиши «Enter»; выбор элемента из списка - двойной щелчок мышью; изменение состояния переключателя щелком мыши или клавишей пробела; выбор элемента из меню выбора - одинарный щелчок мышью).
В качестве первого параметра методу action() передается ссылка на объект класса Event, содержащий всю информацию о событии, второй параметр представляет собой ссылку на объект, вызвавший появление события.
События в методе action() обрабатываются следующим образом. Прежде всего необходимо проверить, объект какого типа создал событие. Это делается при помощи операции instanceof. Рассмотрим пример для обработки событий от кнопок (щелчок мышью на кнопке), предполагая, что контейнер включает в себя кнопки btn1, btn2 и btn3:
public boolean action(Event evt, Object obj)
{
// обработка событий от кнопок
if(evt.target instanceof Button) // объект является кнопкой?
{// получаем ссылку на кнопку, вызвавшую событие
Button btn=(Button)evt.target;
// получаем метку кнопки
String lbl=btn.getLabel();
// проверка, от какой именно кнопки пришло событие
if(btn.equals(btn1)) // от кнопки с номером 1?
{ // обработка события от кнопки 1
................................ }
else if(btn.equals(btn2)) // от кнопки с номером 2?
{ // обработка события от кнопки 2
................................ }
else if(btn.equals(btn3)) // от кнопки с номером 3?
{ // обработка события от кнопки 3
................................ }
else
{ // если событие вызвано кнопкой,
// обработчик которой не
// предусмотрен в данном методе
return false; }
// если событие обработано, иначе return false
return true; }
// аналогичный процесс обработки событий ACTION_EVENT
// от других компонент
if(evt.target instanceof КлассЭлементаGUI)
{ // получаем ссылку на компонент, вызвавший событие
КлассЭлементаGUI element=
(КлассЭлементаGUI)evt.target;
// проверка, от какого именно компонента этого класса
// пришло событие и обработка этого события от
// конкретного компонента
.............................................
return true; // если событие обработано, иначе return false
}
// необработанные события передаем на дальнейшую обработку
return false; }
Нужно отметить, что не все действия пользователя обрабатываются методом action(), например, события линейки прокрутки можно обработать только методом handleEvent(). Методом action() обрабатываются только те события, для которых элемент id объекта evt класса Event равен ACTION_EVENT (см. предыдущую главу). Другие события обрабатываются более универсальным методом handleEvent().
Рекомендация. Если контейнер содержит элементы управления, события от которых не обрабатываются методом action(), то рекомендуется обработку всех событий от всех компонентов производить в методе handleEvent(), чтобы не делить процесс обработки на части, а обрабатывать события централизовано. Процесс обработки событий в методе handleEvent() аналогичен процессу обработки в методе action():
public boolean handleEvent(Event evt)
{ switch(evt.id)
{ default:// передача сообщения на обработку
// методу базового класса
return super.handleEvent(evt);
case Event.ACTION_EVENT:
// обработка событий от кнопок
// объект является кнопкой?
if(evt.target instanceof Button)
{// ссылка на кнопку, вызвавшую событие
Button btn=(Button)evt.target;
// получаем метку кнопки
String lbl=btn.getLabel();
if(btn.equals(btn1)) // событие от кнопки 1?
{// обработка события
.................... }
else if(btn.equals(btn2))
{ // обработка события
.................... }
else if(btn.equals(btn3))
{ // обработка события
.................... }
else return false;
// если событие обработано, иначе return false
return true; }
// аналогичный процесс обработки событий
// Event.ACTION_EVENT от других компонент
if(evt.target instanceof КлассЭлементаGUI)
{ // ссылка на компонент, вызвавший событие
КлассЭлементаGUI element=
(КлассЭлементаGUI)evt.target;
// проверка, от какого именно компонента этого
// класса пришло событие и обработка этого
// события от конкретного компонента
.............................................
// если событие обработано, иначе return false
return true; }
break; }
return true; }