Главная » Java, Web » Движение мыши. Перетаскивание

0

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

Методы для работы с событиями движения мыши описаны в интерфейсе MouseMotionListener. Интерфейс определяет два метода:

public void mouseDragged(MouseEvent evt); public void mouseMoved(MouseEvent evt);

Метод mouseDragged вызывается тогда, когда мышь передвигается при нажатой кнопке. Если при движении мыши кнопка не нажата, то вызывается метод mouseMoved. Параметр evt — это событие типа MouseEvent. Этот параметр содержит такую информацию, как, например, координаты курсора мыши. В процессе движения мыши один из этих методов будет вызываться снова и снова постоянно. Интерфейс определен отдельно, чтобы оставить возможность использовать события мыши, описанные в интерфейсе MouseListener без привлечения без необходимости методов обработки событий, связанных с перемещением мыши.

Для обработки событий перемещения мыши необходимо создать объект, им- плементирующий интерфейс MouseMotionListener, зарегистрировать этот объект в качестве прослушивателя событий перемещения мыши. Для этого вызывается метод addMouseMotionListener. Этот объект будет прослушивать события mouseDragged и mouseMoved, связанные с тем компонентом, где зарегистрирован прослушиватель. В большинстве случаев объект прослушивателя также импле- ментирует и интерфейс MouseListener, тогда прослушиватель сможет реагировать и на события нажатия кнопок мыши. Для объекта drawingSurface определение класса апплета осуществимо, например, следующим образом:

impo гt j ava.a wt.*; import java.awt.event.*;

import javax.swing.*;

public class Mouser extends JApplet

implements MouseListener, MouseMotionListener

{

public void init() {

// инициализация апплета

drasingSurfасе.addMouseListener(this);

drawingSurface.addMouseMotionListener(this);

…    // прочие фукнции инициализации }

…     // методы MouseListener

…     // методы MouseMotionListener

…     // прочие методы и переменные

}

Рис. 1.19. Движение мыши

Код апплета содержится в файле MouseMove.java (листинг 1.18), апплет загружается в браузер с использованием HTML-страницы MouseMove.html (листинг 1.19). При перемещении указателя мыши по апплету, рядом с курсором возникает изображение, соответствующее текущим координатам курсора относительно компонента. Кроме того, апплет отображает и последнее наступившее событие, если были нажаты клавиши-модификаторы, нажатые при наступлении этого события (рис. 1.19).

Листинг 1.18. Файл MouseMove.java

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

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

public class MouseMove extends JApplet

implements MouseListener, MouseMotionListener { Display display;

int mouse_x, mouse_y;       // положение мыши

String modifierKeys = ""; // если не null, то нажаты клавиши// модификаторы

String eventType = null; // если не null, то тип последнего

// события мыши public class Display extends JPanel { I*

Класс, в котором задается холст для рисования апплета. Здесь также задаются переменные мыши: mouse_x, mouse_y, modifierKeys, eventType.

*I

public void paintComponent(Graphics g) { // панель рисования и вывода информации о положении мыши super.paintComponent(g); g.setColor(Color.blue);

g.drawRect(0,0, getSize().width — 1,getSize().height — 1); g.drawRect(1,1, getSize().width — 3,getSize().height — 3); g.setColor(Color.red); if (eventType == null) {

11 если null, то событий мыши не было //и информацию выводить не надо

return; }

g.drawstring("Mouse event type: " + eventType, 6, 18); if (modifierKeys.length() > 0)

g.drawstring("Modifier keys: " + modifierKeys, 6, 34); g.setColor(Color.black);

g.drawstring("(" + mouse_x + "," + mouse_y + ")",

mouse_x, mouse_y); }

}

public void init() {

// задание цвета фона, регистрация прослушивателей

display = new Display();

setContentPane(display);

display.setBackground(Color.white);

display.addMouseListener(this);

display.addMouseMotionListener(this); }

void setInfo(MouseEvent evt)

{

// задание информации о событиях для ее отображения

mouse_x = evt.getX();

mouse_y = evt.getY();

modifierKeys = "";

if (evt.isShiftDown())

modifierKeys += "Shift "; if (evt.isControlDown())

modifierKeys += "Control "; if (evt.isMetaDown())

modifierKeys += "Meta "; if (evt.isAltDown()) modifierKeys += "Alt";

display.repaint(); }

// Имплементация всех методов интерфейсов MouseListener //и MouseMotionListener.

// Каждый метод задает значение для eventType

//и вызывает setInfo для получения информации для отображения, public void mousePressed(MouseEvent evt) { eventType = "mousePressed";

setInfo(evt); }

public void mouseReleased(MouseEvent evt) { eventType = "mouseReleased";

setInfo(evt); }

public void mouseClicked(MouseEvent evt) { eventType = "mouseClicked";

setInfo(evt); }

public void mouseEntered(MouseEvent evt) { eventType = "mouseEntered";

setInfo(evt); }

public void mouseExited(MouseEvent evt) { eventType = "mouseExited";

setInfo(evt); }

public void mouseMoved(MouseEvent evt) { eventType = "mouseMoved";

setInfo(evt); }

public void mouseDragged(MouseEvent evt) { eventType = "mouseDragged";

setInfo(evt); }

Листинг 1.19. Файл MouseMove.html

<p align=center>

<applet code="SimpleTrackMouse.class" width=650 height=400 alt="(Applet ‘MouseMove’ should be displayed here.)"> <font color="#E70000">

(Applet "MouseMove" would be displayed here<br>

if Java were available.)</font> </applet>

В общем случае обработка событий перетаскивания осуществляется с использованием методов обработки событий mousePressed () , mouseDragged () , mouseReleased (). Код может иметь примерно следующий вид.

private int prevX, prevY; // координаты мыши private boolean dragging; // равно true, если перетаскивание

// все еще происходит

… // прочие переменные

public void mousePressed(MouseEvent evt) {

if (мы хотим начать перетаскивание) {

dragging = true;

prevX = evt.getX(); // запомнили исходное положение

prevY = evt.getY(); }

… П прочие функции

}

public void mouseDragged(MouseEvent evt) { // проверка, происходит ли перетаскивание if (dragging == false) return;

int x = evt.getX(); // текущее положение мыши int у = evt.getY(); … // произвели перемещение от (prevX, prevY) к (x,у) prevX = x; // запомнили положение для последующего вызова prevY = у;

}

public void mouseReleased(MouseEvent evt) { // проверка того, происходит ли перетаскивание if (dragging == false) return;

dragging = false; // перетаскивание завершено

… // прочие функции и высвобождение ресурсов }

Типичный пример использования событий перетаскивания — рисование. В данном примере (листинг 1.20) пользователь может рисовать цветные

кривые, а также выбирать цвет, щелкая на соответствующем цветовом квадрате, возможность очистить поле для рисования предусмотрена нажатием на кнопку Ochistim. Этот пример содержит и другие приемы, используемые при программировании графики. Этот апплет, тем не менее, не избавлен от того недостатка, что все нарисованное пропадает, если апплет исчезает из поля зрения, скрываясь за другим приложением (рис. 1.20).

Рис. 1.20. Пример с апплетом для рисования

Код апплета приведен в файле Risuem.java. Этот апплет позволяет рисовать кривые разными цветами. Справа прилагается набор цветов. Выбор цвета осуществляется щелчком на соответствующей цветовой фигуре. Рисование осуществляется путем нажатия кнопки мыши и перемещения мыши с удерживаемой нажатой кнопкой. Рисунок исчезает при изменении размера апплета или после новой прорисовки ранее скрытого аплета.

Листинг 1.20. Файл Risuem.java

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

import java.applet.*;

public class Risuem extends Applet

implements MouseListener, MouseMotionListener { private final static int BLACK = 0,

RED =1, // константы соответствуют цветам

GREEN = 2,

BLUE = 3,

CYAN = 4,

MAGENTA = 5,

YELLOW = 6;

private int currentColor = BLACK; // текущий цвет рисования /*

переменные, определенные в этом фрагменте кода, используются при рисовании */

private int prevX, prevY; // предыдущее положение мыши private boolean dragging; // true, если перетаскивание еще

//не завершилось private Graphics graphicsEorDrawing; // графический контекст,

// используемый для рисования кривых

public void init() { // прослушиватель событий мыши addMouseListener(this) ;

addMouseMotionListener(this) ; }

public void update(Graphics g) { // переопределение метода update

paint(g); }

public void paint(Graphics g) { // рисование содержимого апплета int width = getSize().width; // ширина int height = getSize().height; // высота

int colorSpacing = (height — 56) / 7 // вычисление размера квадратов

// палитры

/*

Заполнение белым цветом области рисования.

Оставляем по три пиксела для границ и 56 пикселов для палитры.

*/

g.setColor(Color.white);

g.fillRect (3, 3, width – 59, height – 6);

// рисование границ

g.setColor(Color.gray);

g.drawRect(0, 0, width-1, height-1);

g.drawRect(1, 1, width-3, height-3);

g.drawRect(2, 2, width-5, height-5);

// серый прямоугольник справа шириной в 56 пикселов

g.fillRect(width – 56, 0, 56, height);

// кнопка Ochistim

д.setColor(Color.white);

д.fillRect(width-53, height-53, 50, 50);

g.setColor(Color.black);

g.drawRect(width-53, height-53, 49, 49);

g.drawstring("Ochistim", width-48, height-23);

111 цветных прямоугольников палитры

д.setColor(Color.black);

д.fillRect(width-53, 3 + 0*colorSpacing, 50, colorSpacing-3); g.setColor(Color.red);

g.fillRect(width-53, 3 + l*colorSpacing, 50, colorSpacing-3); g.setColor(Color.green);

g.fillRect(width-53, 3 + 2*colorSpacing, 50, colorSpacing-3); g.setColor(Color.blue);

g.fillRect(width-53, 3 + 3*colorSpacing, 50, colorSpacing-3); g.setColor(Color.cyan);

g.fillRect(width-53, 3 + 4*colorSpacing, 50, colorSpacing-3); g.setColor(Color.magenta);

g.fillRect(width-53, 3 + 5*colorSpacing, 50, colorSpacing-3); g.setColor(Color.yellow);

g.fillRect(width-53, 3 + 6*colorSpacing, 50, colorSpacing-3); // граница толщиной 2 пиксела вокруг цветных прямоугольников палитры д.setColor(Color.white);

g.drawRect(width-55, 1 + currentColor*colorSpacing, 53, colorSpacing); g.drawRect(width-54, 2 + currentColor*colorSpacing, 51, colorSpacing-

2) ;

}

private void changeColor(int y) {

// изменение цвета после щелчка на прямоугольнике палитры

int width = getSize().width;                // ширина

int height = getSize().height;              // высота

int colorSpacing = (height — 56) /7; // высота одного прямоугольника

// палитры

int newColor = у / colorSpacing;            // номер выбранного цвета

if (newColor < 0 || newColor >6)            // проверка номера цвета

return; /*

Удаление подсветки с прямоугольника старого цвета. Изменение текущего цвета рисования.

Рисование подсветки вокруг прямоугольника нового цвета. */

Graphics g = getGraphics() ; g.setColor(Color.gray) ;

g.drawRect(width-55, 1 + currentColor*colorSpacing, 53, colorSpacing); g.drawRect(width-54, 2 + currentColor*colorSpacing, 51, colorSpacing-2); currentColor = newColor; g.setColor(Color.white);

g.drawRect(width-55, 1 + currentColor*colorSpacing, 53, colorSpacing); g.drawRect(width-54, 2 + currentColor*colorSpacing, 51, colorSpacing-2); g.dispose (); } // end changeColor() private void setUpDrawingGraphics() { // функция вызывается в mousePressed при щелчке на // прямоугольнике цветовой палитры и // задает графический контекст graphicsForDrawing = getGraphics(); switch (currentColor) {

case BLACK: graphicsForDrawing.setColor(Color.black); break; case RED:

graphicsForDrawing.setColor(Color.red); break;

case GREEN: graphicsForDrawing.setColor(Color.green); break;

case BLUE:

graphicsForDrawing.setColor(Color.blue); break; case CYAN:

graphicsForDrawing.setColor(Color.cyan); break;

case MAGENTA: graphicsForDrawing.setColor(Color.magenta); break;

case YELLOW: graphicsForDrawing.setColor(Color.yellow);

break; }

}

public void mousePressed(MouseEvent evt) { // вызывается при нажатии кнопки мыши в апплете, а также // при рисовании, смене цвета и очистке области рисования int х = evt.getX();                 // горизонтальная координата щелчка

int у = evt.getY();                 // вертикальная координата щелчка

int width = getSize().width; // ширина апплета int height = getSize().height; // высота апплета if (dragging == true) return; if (x > width – 53) { // щелчок мыши правее области рисования if (у > height — 53) repaint();  // щелчок на кнопке очистки

else

changeColor(у); // поменять цвет рисования }

else if (х > 3 && х < width — 56 && у > 3 && у < height — 3) { // щелчок в области рисования // начало рисования кривой от точки (х,у) prevX = х; prevY = у; dragging = true; setUpDrawingGraphics();

}

}

public void mouseReleased(MouseEvent evt) {

if (dragging == false) return; dragging = false; graphicsForDrawing.dispose();

graphicsForDrawing = null; }

public void mouseDragged(MouseEvent evt) {

// вызывается при перемещении мыши с удерживаемой нажатой кнопкой if (dragging == false) return;

int x = evt.getX(); // горизонтальная координата мыши int у = evt.getY(); // вертикальная координата мыши if (х < 3)  // проверка координат

х = 3;

if (х > getSize().width — 57) х = getSize().width — 57;

if (У < 3) У = 3;

if (у > getSize().height — 4) у = getSize().height — 4; graphicsForDrawing.drawLine(prevX, prevY, x, у); // прорисовка линии prevX = x;

prevY = y; }

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

}

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

По теме:

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