Книга: Основы программирования с Java
Назад: Пример GUI
Дальше: Функция факториала

Упражнение

Сейчас вы увидите программу Java, которая была разработана с помощью Event Driven программирования как простое приложение, которое позволит вам закреплять и просматривать фотографии на карте.





После того как вы скачали шаблон проекта, вы можете открыть проект CountryMap.







Здесь есть три класса, и вы должны завершить класс СountryMapMouseListener.

Вы увидите, что в дополнение к использованию MouseListener в классе CountryMapMouseListener, интерфейсы ActionListener и PropertyChangeListener используются в классе CountryMapApp.

Мы не рассматривали их в этой лекции.

Но если вы заинтересованы в получении дополнительной информации, вы должны быть в состоянии самостоятельно изучить их на основе знаний, которые вы уже получили.

Если вы посмотрите класс CountryMapMouseListener, вы увидите, что здесь есть реализации методов mouseClicked, mouseEntered, mouseExited, mousePressed и mouseReleased для интерфейса MouseListener.

То, что вы должны сделать, это завершить реализацию метода doBrowsePhoto в классе CountryMapMouseListener.

Это упражнение научит вас на практике извлекать информацию из объекта события, который инкапсулирует информацию о событии, в этом случае, событии мыши.

Мы говорили о getX и getY методах класса MouseEvent, но вы могли бы получить больше информации из объекта MouseEvent.

Чтобы завершить реализацию метода doBrowsePhoto, в дополнение к получению позиции, где произошло событие мыши, вы должны также выяснить, действительно ли было выполнено нажатие мыши правой или левой кнопкой.

Подробнее информацию о классе MouseEvent можно получить здесь.







Это веб-страница документации для класса MouseEvent.

Большинство мышек, имеют по крайней мере две кнопки, правую кнопку или левую кнопку, но некоторые мыши имеют третью кнопку или колесо.

Вы сможете увидеть из Javadoc документации, что они представлены как константы полей BUTTON1, BUTTON2 и BUTTON3, где BUTTON1 является левой кнопкой и BUTTON3 правой кнопкой.

В Javadoc документации, вы также сможете найти метод getButton, который позволит определить, у какой кнопки мыши изменилось состояние.

Вопросы

Задача

Рассмотрим модель делегации событий для события щелчка мыши. Метод mouseClicked(MouseEvent e) является методом, определенным в …

Варианты ответа:

1. класс источника события

2. класс объекта события

3. класс слушателя событий

4. как класс источника событий, так и класс слушателя события

5. как класс объекта события, так и класс слушателя события

Ответ: 3.

Объяснение.

Методы обработки события определяются в классе слушателя событий. Для события щелчка мыши, метод mouseClicked() определен в классе слушателя, который реализует интерфейс MouseListener.

Задача

Учитывая, что слушатель мыши зарегистрирован в объекте источника, который из следующих методов зарегистрированного слушателя мыши вызывается после щелчка кнопки мыши на объекте источника?

1. public void mousePressed(MouseEvent e)

2. public void mouseReleased(MouseEvent e)

3. public void mouseEntered(MouseEvent e)

4. public void mouseExited(MouseEvent e)

5. public void mouseClicked(MouseEvent e)

Варианты ответа:

1. 5

2. 1 and 2

3. 1, 2 и 5

4. Все

Ответ: 3.

Объяснение

Событие щелчка мыши включает в себя два действия, нажатие кнопки мыши и отпускание. Поэтому, когда мы нажимаем на исходном объекте, метод mousePressed() вызывается первым, а затем mouseReleased() метод. Наконец, метод mouseClicked() вызывается.

Задача

В этом упражнении вы должны завершить реализацию метода doBrowsePhoto() в классе CountryMapMouseListener. По окончании, прикрепленное фото можно масштабировать левой кнопкой мыши и масштабировать обратно до исходного размера, щелкнув правой кнопкой мыши.

Инструкции:

1. Метод doBrowsePhoto() принимает объект MouseEvent в качестве параметра. Используйте методы экземпляра класса MouseEvent для инициализации четырех различных переменных в соответствии с приведенными ниже шагами, используя Javadoc класса MouseEvent.

2. Создать int локальную переменную х, и инициализировать ее в х положение события мыши.

3. Создать int локальную переменную у, и инициализировать ее в у позицию события мыши.

4. Создать логическую локальную переменную leftClicked, и инициализировать ее в true значение, если щелкается левая кнопка мыши во время события. В противном случае, инициализировать ее false. Советы: левая кнопки мыши щелкается, если метод getButton() экземпляра возвращает значение равное статической постоянной BUTTON1 в классе MouseEvent.

5. Создать логическую локальную переменную rightClicked, и инициализировать ее в true значение, если правая кнопка мыши щелкается во время события. В противном случае, инициализировать ее false. Советы: правая кнопка мыши щелкается, если метод getButton() экземпляра возвращается значение равное статической постоянной BUTTON3 в классе MouseEvent.

Инструкции запуска программы:

1. Чтобы запустить программу, создайте экземпляр класса CountryMapApp и вызовите метод main.

2. Программа работает в трех режимах, Browse mode, Pin mode и Delete mode. Программа в режиме Browse mode по умолчанию.

3. Чтобы добавить фотографию, нажмите кнопку режима Pin mode и нажмите на местоположение на карте. Изображение, выбранное в выпадающем диалоге, будет добавлено в местоположение на карте.

4. Чтобы изменить масштаб фото, нажать кнопку Browse mode. Щелкните левой кнопкой мыши на фото для его масштабирования и щелкните правой кнопкой мыши на фотографии для масштабирования до исходного размера.

5. Чтобы удалить фотографию, нажмите кнопку Delete mode. Щелкните левой кнопкой мыши на фото, чтобы удалить его.

Рекурсия

Теперь мы обсудим новую тему, которая называется рекурсия.

Когда мы решаем задачи, мы часто пытаемся разложить задачу на подзадачи.

В объектно-ориентированном программировании, мы стараемся реализовать эти подзадачи, как методы в классах.

Такой подход часто называют разделяй и властвуй.

Такого рода стратегии решения проблем довольно широко используются в решении повседневных жизненных задач.

Это обычная практика, когда мы не можем решить проблему сами, мы пробуем просить других о помощи.

Спрашивая помощь у других, вы можете сделать решение задачи легче.

В программировании, такой подход, как вызов другой функции или метода следует подобной идеи.

То есть, метод может вызывать другие методы, чтобы сделать часть работы в решении большой задачи.

Тем не менее, как правило, когда вы просите о помощи, вы просите помочь других.

Очень редко, вы просите себя, потому что вы, как правило, обращаетесь за помощью только тогда, когда вы не можете решить проблему сами.

Но в программировании, метод может вызывать себя самого, а в некоторых случаях, это может быть естественным способом что-то сделать.

Метод, вызывающий сам себя, реализует основную идею рекурсии.

Чтобы проиллюстрировать идею рекурсии, давайте посмотрим на пример.







Это называется задачей рукопожатия.

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

Скажем, есть какое-то количество людей в комнате, и предполагается, что их число n.

Если каждый человек пожмет руку один раз и только один раз каждому другому человеку в комнате, вопрос в том, какое будет общее число рукопожатий, которые будут сделаны, когда есть n человек?

Давайте использовать обозначение h(n) для представления общего количества рукопожатий для любого числа n.

Подумайте об этом, как бы вы решили эту задачу.

Когда есть только один человек, в этом случае не будет никакого рукопожатия.

В простейшем случае, когда у вас есть только два человека в комнате, число рукопожатий будет h(n) с n, равным 2.

Понятно, что там может быть только одно рукопожатие, когда есть только два человека, таким образом, h(2) будет равно 1.

Что делать, если есть еще один человек, и входя в комнату, человек будет пожимать руку двум лицам, которые уже находятся в комнате, и так как эти два человека уже пожимали руку друг другу, никакого дополнительного рукопожатия не будет для двух из них.

Таким образом, h(3) будет h(2) плюс 2.

То есть, предыдущее число рукопожатий плюс два новых рукопожатия для человека, который только что вошел в комнату.

Когда четвертый человек войдет в комнату, нужно использовать тот же алгоритм.

Этот четвертый человек будет пожимать руку трем людям, которые уже находятся в комнате и для трех человек, которые уже в комнате, не будет никаких дополнительных рукопожатий между собой.

Таким образом, общее число рукопожатий для 4-х человек, или h(4) будет h(3) плюс 3, это новые рукопожатия для четвертого человека.

Надеюсь, вы уже видите здесь некий шаблон.

В общем, когда имеется n лиц, общее количество рукопожатий будет h(n-1), то есть, количество рукопожатий для n-1 человек, которые уже в комнате, плюс n-1 новых рукопожатий для n-го человека, входящего в комнату.

Так что, общий вид решения является h(n) = h(n-1) + n – 1.

Назад: Пример GUI
Дальше: Функция факториала