Главная Интернет WEB-учебник Java в примерах


Интернет клуб

Новая страница
Описание html
Javascript
Java в примерах

Что такое JAVA?
Первое приложение на JAVA
Первый апплет на JAVA
Управление шрифтами
Строковые переменные
Работа с массивами
Работа с графикой
Операции с мышкой
Операции с клавиатурой
Структура апплета
Работа с потоками
Передача параметров в апплет
Загрузка изображения в апплет
Контроль за ходом загрузки изображения
Двойная буферизация
Создание изображения из массива данных
Корректировка изображения

Полезные сайты
Задайте вопрос









Web-учебник. Раздел 4. Java в примерах.

Операции с мышкой







Мы дошли до обработки событий.
Теперь перед нами 2 пути. Есть две основные модели обработки событий:
В версии 1.0 модель основана на наследовании. Разработаны классы, в них определены и описаны методы обработки событий. Программист может наследовать классы, создавать подклассы, может переоределить все или часть методов, но они уже существуют.
Важно подчеркнуть, что все, что описано на тему обработки событий во всех книгах, вышедших в 1996-1997 годах на русском языке, описывает именно эту модель обработки событий.
Версия 1.1 Java появилась только в 1997 году. В ней изменена обработка событий по сравнению с версией 1.0 . Разработчики языка считают, что модель 1.0 подходит для небольших программ, но не годится для больших систем.
В модели 1.1 вся ответственность за обработку событий возлагается на прикладного программиста. В системе создается только самый необходимый костяк - интерфейсы с абстрактными классами. Прикладной программист должен сам описать все методы.
Теперь возникает такой интересный вопрос - какую модель мне описывать?

С одной стороны, модель 1.0 уже обкатана, описана в большом количестве книг известных авторов, в том числе на русском языке, существует множество примеров. Да и "браузеры" эту модель дружно поддерживают.

С одной стороны, модель 1.1 только появилась, примеров в документации явно недостаточно, приходится лазить по Интернету в поисках дополнительной информации, находишь пример, а он у тебя выполняться не хочет, и бьешься лбом об стенку, и не с кем посоветоваться.
Думаю, что на русском языке новая система еще не описана - во всяком случае, я буду благодарен всем, кто пришлет мне ссылку на опубликованное в Интернет или в книгах описание новой системы на русском языке.
И с "браузерами" проблема:
- Internet Explorer 4.0 еще более-менее поддерживает модель 1.1 , хотя некоторые необьяснимые странности в этой модели я за ним замечал.
- Netscape Navigator эту модель вообще не поддерживает. Сначала его разработчики хотели поставить "заплатки" на уже существующих версиях, но потом признали, что последняя версия Netscape Navigator 4.04 новую модель не поддерживает и поддерживать не будет, и полная поддержка будет осуществлена только в версии Netscape Navigator 5.

Взвесив все эти факторы, я, конечно, решил описывать новую модель 1.1 - так интереснее. И вообще - зачем нам изучать отжившие модели?

Я никого не пугаю, но уже существует документация бета - версии 1.2 . Короче, живем в эпоху перемен.

Но - перейдем к нашим мышам.

Обработка событий мышки с помощью методов mouseUp, mouseDpwn, mouseDraw, описанных в модели 1.0 - уже изменена.

Вначале вкратце несколько понятий, важных для дальнейшего изложения.
Мы во всех примерах уже пользовались наследованием класса Applet.
Пусть класс NewClass наследует класс OldClass. Тогда NewClass называется подклассом, а OldClass называется суперклассом. Например, класс Applet является суперклассом во всех наших программах.
Абстрактный метод - это функция, которая определена в суперклассе, и чей код описан в подклассе.Например, рассмотрим абстрактный метод getSchum. Он определен в суперклассе следующим образом:

public abstract int getSchum(int, int);

а в подклассе раскрываем код:

public int getSchum(int firstX, secondX) {
   return (firstX + secondX);
}

Абстрактный класс - это класс, содержащий хотя бы один абстрактный метод.
В подклассе следует привести коды всех абстрактных методов суперкласса, иначе этот подкласс будет сам считаться абстрактным. (Я еще окончательно Вас не запутал?)
Интерфейс - это абстрактный класс, состоящий только из абстрактных методов.

Для обработки событий мыши используются класс MouseEvent и два интерфейса: MouseListener и MouseMotionListener

КлассMouseEvent служит параметром во всех описанных ниже методах обработки событий мыши.
Основные методы этого класса:
int getX() - возвращает координату X в момент события.
int getY() - возвращает координату Yв момент события.
Point getPoint() - возвращает координаты X и Y в момент события.
int getClickCount() - возвращает количество нажатий мыши при последнем событии.

Интерфейс MouseListener содержит 5 абстрактных методов:
mouseClicked(MouseEvent) - вызывается при щелчке мыши в обьекте,
mouseEntemaroon(MouseEvent) - вызывается при входе мыши в обьект,
mouseExited(MouseEvent) - вызывается при выходе мыши из обьекта,
mousePressed(MouseEvent) - вызывается при нажатии мыши в обьекте,
mouseReleased(MouseEvent) - вызывается при освобождении мыши в обьекте.
Для работы с методами интерфейса MouseListener следует:
1. Задать implement MouseListener при обьявлении подкласса,
2. В подклассе задать:
add MouseListener(MouseListener l);

Интерфейс MouseMotionListener содержит 2 абстрактных метода:
mouseMoved(MouseEvent) - вызывается при движении мыши в обьекте без нажатия,
mouseDragged(MouseEvent) - вызывается при движении нажатой мыши в обьекте.
Для работы с методами интерфейса MouseMotionListener следует:
1. Задать implement MouseMotionListener при обьявлении подкласса,
2. В подклассе задать:
add MouseMotionListener(MouseMotionListener l);

Ниже приводится апплет MyFirstMouse . К сожалению (см. эпиграф к данному разделу) он работает в InternetExplorer, но не работает в Netscape Navigator.

//------------------------------------------------------------  
//   Program :  MyFirstMouse
//------------------------------------------------------------  
//   Author  :  Katz Yakov 
//------------------------------------------------------------  
//   Date    :  13/12/97
//------------------------------------------------------------  
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
//------------------------------------------------------------  
// Определение класса MyFirstMouse с использованием 
// суперкласса Applet и интерфейсов обработки мышки
// MouseListener и MouseMotionListener 
public  class  MyFirstMouse  extends  Applet  
   implements MouseListener, MouseMotionListener{
   // Определяем текстовые переменные для отображения 
   // каждого из событий мышки 
   String TextMouseClicked;
   String TextMouseEntemaroon;
   String TextMouseExited;
   String TextMousePressed;
   String TextMouseReleased;
   String TextMouseDragged;
   String TextMouseMoved;
   // Метод init работает всегда в начале работы апплета,
   // мы его разберем подробнее в следующих разделах.
   public void init() {
      // Инициализация интерфейсов
      addMouseListener(this);
      addMouseMotionListener(this);
      // Очистка текстовых переменных
      InitTextVariables();
   } 
   // Задание метода перерисовки окна апплета
   public  void  paint  (Graphics  gr) {
      // Вывод заглавия в окне апплета
      gr.drawString ("Functions Mouse",  20,  20);
      // Проверка каждой текстовой константы
      // и вывод в апплет только ненулевой константы
      // (может быть только одна - в соответствии
      // с последним событием)
      if (TextMouseClicked != null)
         gr.drawString (TextMouseClicked,  20,  50);
      if (TextMouseEntemaroon != null)
         gr.drawString (TextMouseEntemaroon,  20,  80);
      if (TextMouseExited  != null)
         gr.drawString (TextMouseExited,   20, 110);
      if (TextMousePressed != null)
         gr.drawString (TextMousePressed,  20, 140);
      if (TextMouseReleased != null)
         gr.drawString (TextMouseReleased, 20, 170);
      if (TextMouseDragged != null)
         gr.drawString (TextMouseDragged,  20, 200);
      if (TextMouseMoved != null)
         gr.drawString (TextMouseMoved,    20, 230);
   }
   // Метод обработки щелчка мышки
   public void mouseClicked(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки ввода мышки в обьект
   public void mouseEntemaroon(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки вывода мышки из обьекта
   public void mouseExited(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки нажатия кнопки мышки в обьекте
   public void mousePressed(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMousePressed = "mousePressed  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки освобождения кнопки  мышки в обьекте
   public void mouseReleased(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки движения "нажатой" мышки в обьекте
   public void mouseDragged(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод обработки движения мышки в обьекте
   public void mouseMoved(MouseEvent event) {
      // Очистка текстовых переменных
      InitTextVariables();
      // Формирование текстовой переменной
      TextMouseClicked = "mouseClicked  : X = " + event.getX()
                         + " Y = " + event.getY();
      // Перерисовка окна апплета,
      // этот метод вызывает метод paint 
      repaint();
   }
   // Метод очистки текстовых переменных
   void InitTextVariables() {
      TextMouseClicked = null;
      TextMouseEntemaroon = null;
      TextMouseExited  = null;
      TextMousePressed = null;
      TextMouseReleased = null;
      TextMouseDragged = null;
      TextMouseMoved = null;
   }
}   
Апплет MyFirstMouse выглядит следующим образом:







  ©1996-2007   Megapolis Org   E-mail:   info@megapolis.org