Чтение онлайн

на главную

Жанры

Java: руководство для начинающих
Шрифт:

Для того чтобы стало понятнее, как пользоваться моделью делегирования событий на практике, рассмотрим простой пример, в котором обрабатывается одни из самых распространенных видов событий: события от мыши. Этот пример демонстрирует порядок обработки элементарных событий от мыши. (Следует также иметь в виду, что обрабатывать можно и события от прокрутки колесика мыши. Но эта возможность оставляется вам в качестве упражнения для самостоятельного выполнения.) Обработка событий от мыши

Для обработки событий от мыши следует реализовать интерфейсы MouseListener и MouseMotionListener. В интерфейсе MouseListener объявлено пять методов. По щелчку кнопкой мыши вызывается метод mouseClicked . Если курсор мыши наводится на компонент пользовательского интерфейса, вызывается метод mouseEntered , а если курсор мыши перемещается с этого компонента — метод mouseExited . Методы mousePressed

и mouseReleased вызываются, когда кнопка мыши нажимается и отпускается соответственно.

Ниже приведены общие формы объявления упомянутых выше методов. void mouseClicked(MouseEvent те) void mouseEntered(MouseEvent me) void mouseExited(MouseEvent me) void mousePressed(MouseEvent me) void mouseReleased(MouseEvent me)

В интерфейсе MouseMotionListener объявлены два метода. Метод mouseDragged многократно вызывается при перетаскивании мыши, когда нажата ее левая кнопка. А обычное перемещение мыши приводит к такому же многократному вызову метода mouseMoved . Ниже приведены общие формы объявления этих методов. void mouseDragged(MouseEvent те) void mouseMoved(MouseEvent me)

Событие описывается объектом типа MouseEvent, передаваемым каждому из методов в качестве параметра те. В классе MouseEvent определен целый ряд методов, которые можно использовать для получения подробных сведений о наступившем событии. Вероятно, наиболее употребительными в классе MouseEvent являются методы getx и getY , возвращающие координаты текущего положения курсора мыши (относительно окна) в момент наступления события. Ниже приведены общие формы объявления этих методов. int getX int getY

В примере, приведенном в следующем разделе, эти методы будут использованы для отображения сведений о текущем положении курсора мыши. Простой пример апплета, демонстрирующий обработку событий от мыши

В этом разделе представлен пример апплета, в котором обрабатываются элементарные события от мыши, а в строке состояния отображаются координаты текущего положения курсора мыши. При нажатии кнопки мыши в месте расположения курсора на экран выводится слово "Down" (Нажато), а при отпускании кнопки — слово "Up" (Отпущено). И наконец, по щелчку кнопкой мыши в верхнем левом углу окна апплета появляется сообщение "Mouse clicked" (Произведен щелчок кнопкой мыши).

Когда курсор мыши наводится на окно апплета или отводится от него, в левом верхнем его углу выводится соответствующее сообщение. При перетаскивании курсора мыши его сопровождает символ *. Кроме того, при нажатии и отпускании кнопки мыши или перетаскивании курсора координаты его текущего положения сначала сохраняются в переменных mouseX и mouseY, а затем используются в методе paint для вывода сообщения в той точке экрана, где произошло событие от мыши. // Демонстрация обработки событий от мыши, import java.awt.event.*; import java.applet.*; /* <applet code="MouseEvents" width=300 height=100> </applet> */ public class MouseEvents extends Applet implements MouseListener, MouseMotionListener { String msg = ""; int mouseX = 0, mouseY =0; // Координаты курсора мыши public void init { // Этот класс регистрируется в качестве приемника событий от мыши. addMouseListener(this); addMouseMotionListener(this); } // обработать событие, наступающее по щелчку кнопкой мыши // Этот и другие методы обработки событий вызываются при // наступлении разных событий от мыши. public void mouseClicked(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse clicked."; repaint; } // обработать событие, наступающее при наведении курсора // мыши на компонент пользовательского интерфейса public void mouseEntered(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse entered."; repaint; } // обработать событие, наступающее при отведении курсора // мыши от компонента пользовательского интерфейса public void mouseExited(MouseEvent me) { mouseX = 0; mouseY = 10; msg = "Mouse exited."; repaint; } // обработать событие, наступающее при нажатии кнопки мыши public void mousePressed(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getX; mouseY = me.getYO; msg = "Down"; repaint; } // обработать событие, наступающее при отпускании кнопки мыши public void mouseReleased(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getXO; mouseY = me.getYO; msg = "Up"; repaint; } // обработать событие, наступающее при перетаскивании курсора мыши public void mouseDragged(MouseEvent me) { // сохранить координаты текущего положения курсора mouseX = me.getXO; mouseY = me.getYO; msg = "*"; . showStatus("Dragging mouse at " + mouseX + ", " + mouseY); repaint; } // обработать событие, наступающее при перемещении курсора мыши public void mouseMoved(MouseEvent me) { //

отобразить текущее положение курсора в строке состояния showStatus("Moving mouse at " + me.getXO + "t " + me.getY ) ; } // отобразить сообщение из переменной msg в окне апплета // по координатам текущего положения курсора public void paint(Graphics g) { g.drawString(msg, mouseX, mouseY); } }

Выполнение этого апплета дает приведенный ниже результат.

Рассмотрим приведенный выше исходный код апплета более подробно. Класс MouseEvents расширяет класс Applet и реализует интерфейсы MouseListener и MouseMotionListener. В этих интерфейсах объявлены методы, получающие и обрабатывающие различные виды событий от мыши. В данном примере апплет одновременно выступает в роли источника и приемника событий. И это вполне допустимо, поскольку Applet является подклассом, производным от суперкласса Component, в котором определены методы addMouseListener и addMouseMotionListener . Ситуация, когда один и тот же класс одновременно служит источником и приемником событий, является типичной для апплетов.

В методе init апплет регистрируется как приемник событий от мыши. Для этой цели используются методы addMouseListener и addMouseMotionListener , являющиеся членами класса Component. Ниже приведены общие формы объявления этих методов. void addMouseListener(MouseListener ml) void addMouseMotionListener(MouseMotionListener mml)

где ml и mml — ссылки на объекты, принимающие события от мыши и перемещения мыши соответственно. В данном примере для приема и обработки обоих видов событий используется один и тот же объект.

В рассматриваемом здесь апплете реализованы все методы, объявленные в интерфейсах MouseListener и MouseMotionListener. Они выступают в роли обработчиков разных событий, после чего возвращают управление. Другие ключевые слова Java

И в завершение этой главы будет сделан краткий обзор остальных, не упоминавшихся ранее ключевых слов Java. К их числу относятся следующие ключевые слова:

transient

volatile

instanceof

native

strictfp

assert Перечисленные выше ключевые слова используются в более сложных программах, чем те, которые представлены для примера в этой книге. Рассмотрим эти ключевые слова вкратце, чтобы дать хотя бы самое общее представление об их назначении. Модификаторы transient и volatile

Ключевые слова transient и volatile имеют весьма специфическое назначение. Если переменная экземпляра объявляется как transient, то при сохранении объекта ее содержимое не запоминается. Иными словами, поле transient не влияет на состояние объекта.

Модификатор volatile упоминался в главе И, но он заслуживает более пристального внимания. Объявив переменную как volatile, вы сообщаете компилятору, что ее значение может быть неожиданно изменено в результате действий, выполняемых в других частях программы. В главе 11 было показано, что подобная ситуация может возникнуть в многопоточных программах. В них одна и та же переменная часто используется несколькими потоками. Из соображений эффективности каждый поток может содержать собственную копию разделяемой переменной. Подлинная копия (или оригинал) переменной обновляется в различные моменты времени, например, при выполнении метода, объявленного как synchronized. Как правило, такой подход себя оправдывает, но иногда он оказывается неуместным. Ведь иногда требуется, чтобы оригинал переменной отражал текущее состояние, используемое во всех потоках. И для того чтобы обеспечить выполнение этого условия, переменную нужно объявить как volatile. Ключевое слово instanceof

Иногда в процессе выполнения программы требуется выяснить тип того или иного объекта. Допустим, в одном потоке формируются объекты разных типов, а в другом потоке они обрабатываются. В таком случае обрабатывающему потоку должен быть известен тип того или иного объекта. Об этом должно быть известно и в том случае, когда приведение типов производится в процессе выполнения программы. В Java недопустимое приведение типов вызывает ошибку при выполнении программы. Многие недопустимые попытки приведения типов могут быть выявлены еще на стадии компиляции. Но если в приведение типов вовлекается иерархия классов, то такое приведение типов может оказаться недопустимым, хотя обнаружить его удастся лишь после запуска программы на выполнение. Так, переменная ссылки на суперкласс может ссылаться и на объекты его подклассов, поэтому на стадии компиляции не всегда удается определить, допустимо ли приведение типов, в которое вовлечена ссылка на суперкласс. В качестве выхода из подобных ситуаций служит использование ключевого слова instanceof. Ниже приведена общая форма оператора с этим ключевым словом. экземпляр instanceof тип

Поделиться:
Популярные книги

Удиви меня

Юнина Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Удиви меня

Live-rpg. эволюция-5

Кронос Александр
5. Эволюция. Live-RPG
Фантастика:
боевая фантастика
5.69
рейтинг книги
Live-rpg. эволюция-5

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Сиротка

Первухин Андрей Евгеньевич
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Сиротка

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Изгой. Трилогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
8.45
рейтинг книги
Изгой. Трилогия

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена