Главная » Java, Web » Класс MouseEvent и интерфейс MouseListener

0

Интерфейс MouseListener описывает пять методов:

public void mousePressed(MouseEvent evt); public void mouseReleased(MouseEvent evt); public void mouseClicked(MouseEvent evt); public void mouseEntered(MouseEvent evt); public void mouseExited(MouseEvent evt);

Метод mousePressed вызывается сразу после того, как пользователь нажмет одну из кнопок мыши. Метод mouseReleased выполняется после того, как кнопка мыши будет отпущена. Эти два метода нашли наиболее широкое применение. Следует иметь в виду, что в теле класса прослушивателя событий должны быть определены все методы соответствующего интерфейса прослушивателя. Если не требуется реагировать на те или иные события, то тело соответствующего метода следует оставить пустым.

Метод mouseClicked вызывается при щелчке мышью (двойной щелчок — нажать и быстро отпустить кнопку мыши). Следует, однако, иметь в виду, что при наступлении события mouseClicked будут вызваны также и методы обработки всех трех событий, из которых состоит событие mouseClicked, а именно, методы mousePressed, mouseReleased — в соответствующей последовательности. После выполнения этих методов будет выполнен метод mouseClicked. Метод mouseEntered вызывается тогда, когда курсор мыши входит в указанный компонент, а метод mouseExited — в том случае, когда мышь покидает этот компонент. Эти методы полезно использовать тогда, когда требуется произвести какие-либо действия, например, изменить внешний вид компонента, когда курсор находится над данным компонентом.

В качестве первого примера рассмотрим измененный вариант апплета, который мы уже изучали в предыдущем разделе. Этот апплет будет изменять свой вид при каждом щелчке мыши над апплетом (листинг 1.14).

Мы создадим новый класс апплета ciickstring, используя созданный нами ранее класс апплета Appietstring в качестве суперкласса.

Листинг 1.14. Файл ClickString.java                                                                                                    j

impo гt j ava.awt.event.*;

public class ClickString extends StringApplet implements MouseListener {

public void init()

/* После создания апплета инициализируется суперкласс RandomStrings.

Апплет будет прослушивать события мыши на холсте drawingSurfасе.

Переменная drawingSurface была определена в классе RandomStrings —

это прямоугольная область, заполняющая весь апплет. */ super.init();

drawingSurface.addMouseListener(this); public void mousePressed(MouseEvent evt)

/* при нажатии кнопки мыши вызывается метод paintComponent() в компоненте drawingSurface */ drawingSurface.repaint();

public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { }

Апплет (листинг 1.15) загружается в браузер с помощью HTML-файла ClickString.html (рис. 1.16 и рис. 1.17).

Листинг 1.15. Файл ClickString.html

<р align=center>

<applet code="ClickString.class" width=650 height=350

alt="(Applet ‘ClickString’ should be displayed here.)"> <font color="#E70000">

(Applet "ClickString" would be displayed here<br> if Java were available.)</font> </applet> </p>

Рис. 1.16. Вид апплета сразу после загрузки

 

Рис. 1.17. Вид апплета после нажатия кнопки мыши

Класс апплета описан с помощью следующей строки:

public class ClickString extends StringApplet implements MouseListener { … } Это не единственный важный момент. При написании этого апплета мы используем пакет event: import java.awt.event.*;

Кроме того, необходимо имплементировать методы интерфейса прослушивателя событий мыши, то есть следующие функции:

public void mousePressed(MouseEvent evt) {

drawingSurface.repaint(); }

public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { }

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

Наконец, прослушиватель должен быть вставлен в компонент. В нашем случае, ЭТО "холст" drawingSurface: drawingSurface.addMouseListener(this);

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

В следующем примере мы рассмотрим часто встречающийся случай, когда требуется узнать местоположение курсора мыши в момент наступления того или иного события. Эти данные передаются на объект evt. Чтобы получить координаты, используются методы evt.getxo и evt.getY(). Эти методы возвращают целые значения, соответствующие координатам положения курсора относительно координат компонента. Верхний левый угол компонента имеет координаты (0, 0). При наступлении события на клавиатуре компьютера могут быть нажаты клавиши-модификаторы, такие как <Shift> или <Ctrl>. Для обработки событий объект события содержит специальные методы проверки нажатия этих клавиш, а именно методы evt. isShiftDown (), evt. isControlDown () , evt. isAltDown () И evt.isMetaDown (), которые ВОЗВращают логические значения. Эти методы могут быть вызваны для того, чтобы проверить, была ли нажата та или иная клавиша-модификатор в момент наступления события.

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

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

Код для класса Twociicks приведен ниже (листинг 1.16). Листинг 1.16. Файл TwoClicks.java

Демонстрация работы с событиями мыши.

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

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

impo гt j ava.awt.*; impo rt j ava.awt.event.*; import javax.swing. *;

public class TwoClicks extends JApplet {

public void init()

// инициализация апплета, дисплей // Display будет содержать панель для отображения // холста апплета, на котором рисуются фигуры Display display = new Display(); setContentPanel(display);

class Display extends JPanel implements MouseListener {

// панель апплета, содержащая холст для рисования Display () {

// конструктор задает цвет фона // панели и устанавливает прослушиватель setBackground(Color.yellow); addMouseListener(this);

}

public void mousePressed(MouseEvent evt)

// Метод обработки события // нажатия кнопки.

// Панель является прослушивателем // для самой себя.

if (evt.isShiftDown()) {

// При удерджании клавиши <Shift>, // вызывается метод repaint.

// Этот метод определен в суперклассе JPanel. //Он производит закраску фона // панели одним цветом, repaint();

return; }

int х = evt.getX(); // горизонтальная координата щелчка мыши int у = evt.getY(); // вертикальная координата щелчка мыши Graphics g = getGraphics(); // графический контекст рисования

//в панели JPanel

if (evt.isMetaDown()) {

// Произведен щелчок правой кнопкой мыши в точке (х,у).

// Прорисовка синего овала с центром в точке (х,у).

// Черный контур делает овал более

// отчетливым и заметным.

g.setColor(Color.blue);

g.fillOval(x – 55, у – 25, 110, 50);

д.setColor(Color.black) ;

g.drawOval(x – 55, у – 25, 110, 50); }

else {

// Произведен щелчок левой кнопкой мыши в точке (х,у). // Прорисовка красного прямоугольника с центром в (х,у). g.setColor(Color.red); д.fillRect(х – 55, у – 25, 110, 50); д.setColor(Color.black);

g.drawRect(х – 55, у – 25, 110, 50); }

д.dispose(); // работа с графическим контекстом завершена

}

// пустые функции в соответствии с интерфейсом MouseListener public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { }

public void mouseReleased(MouseEvent evt) { } }

Файл для загрузки апплета — файл TwoClicks.html (рис. 1.18).

Листинг 1.17. Файл TwoCIlcks.html

<Р align=center>

<applet code="TwoClicks.class" width=700 height=380 alt="(Applet ‘TwoClicks’ should be displayed here.)"> <font color="#E70000">

(Applet "TwoClicks" would be displayed here<br> if Java were available.)</font> </applet> </p>

Рис. 1.18. Апплет реагирует на нажатия кнопок мыши и рисует фигуры

Здесь мы снова использовали jAppiet, в который поместили созданный нами класс Display, внутри которого был определен холст (листинг 1.17). В классе Display содержится имплементация интерфейса MouseListener,

в класс вставлен и росл уши нагель addMouseListener (this), указатель this относится к классу Display, поскольку метод был вызван именно из этого класса. Иными словами, все события мыши, сгенерированные в объекте Display, будут направлены самому объекту Display.

Класс Display нарушает правило, согласно которому все рисование должно быть осуществлено при помощи метода paintcomponent (). У нас же рисование прямоугольников и овалов осуществляется непосредственно с использованием mousePressed (). Это стало возможным потому, что мы предварительно получили графический контекст, указав g = getGraphics (). Затем для экономии ресурсов системы мы освобождаем графический контекст при помощи g. dispose ().

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии