Движение на мишката. Плъзгане

Мишката винаги генерира събития, докато се движи. Тези събития могат да се използват и да се реагира на тях. Важен момент, който трябва да имате предвид при работа със събития за движение на мишката, е плъзгането. Плъзгането е преместване на елементи от едно място на екрана на компютъра на друго, докато се задържа бутонът на мишката.

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

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

Методът mouseDragged се извиква, когато мишката се движи, докато бутонът е натиснат. Ако бутонът не е натиснат по време на движение на мишката, тогава се извиква методът mouseMoved. Параметърът evt е събитие от тип MouseEvent. Този параметър съдържа информация като координатите на курсора на мишката. Докато мишката се движи, един от тези методи ще се извиква отново и отново и отново. Интерфейсът е дефиниран отделно, за да остави възможността да се използват събитията на мишката, описани в интерфейса на MouseListener, без да се извиква, без да са необходими методи за обработка на събития, свързани с движението на мишката.

За да обработвате събития за движение на мишката, трябва да създадете обект, който реализира интерфейса MouseMotionListener, и да регистрирате този обект като слушател за събития с движение на мишката. За това се извиква методът addMouseMotionListener. Този обект ще прослушва събитията mouseDragged и mouseMoved, свързани с компонента, където е регистриран слушателят. В повечето случаи обектът слушател също така изпълнява интерфейса MouseListener, така че слушателят да може да реагира и на събития на мишката. За обекта drawingSurface дефиницията на клас на аплет е осъществима, например, както следва:

impo rt j ava.a wt. *; импортиране на java.awt.event. *;

публичен клас Mouser разширява JApplet

реализира MouseListener, MouseMotionListener

public void init ()

// други функции за инициализация>

// други методи и променливи

MouseEvent public

Фигура: 1.19. Движение на мишката

Кодът на аплета се съдържа във файла MouseMove.java (Листинг 1.18) и аплетът се зарежда в браузъра с помощта на HTML страницата MouseMove.html (Листинг 1.19). Когато преместите показалеца на мишката върху аплета, до курсора се появява изображение, съответстващо на текущите координати на курсора спрямо компонента. В допълнение, аплетът показва и последното настъпило събитие, ако са били натиснати модифициращите клавиши, натиснати, когато е настъпило това събитие (фиг. 1.19).

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

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

impo rt j ava.awt. *; impo rt j ava.awt.event. *; внос javax.swing. *;

публичен клас MouseMove разширява JApplet

реализира MouseListener, MouseMotionListener < Display display;

int mouse_x, mouse_y; // позиция на мишката

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

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

// мишка събития публичен клас Display разширява JPanel < I*

Класът, който задава платното за изчертаване на аплета. Тук се задават и променливи на мишката: mouse_x, mouse_y, modifierKeys, eventType.

g.drawRect (0,0, getSize (). ширина - 1, getSize (). височина - 1); g.drawRect (1,1, getSize (). ширина - 3, getSize (). височина - 3); g.setColor (Color.red); if (eventType == null)

11 ако е нула, тогава не е имало събития на мишката // и не трябва да се показва информация

g.drawstring ("Тип събитие на мишката:" + eventType, 6, 18); ако (modifierKeys.length ()> 0)

g.drawstring ("Модификатор ключове:" + modifierKeys, 6, 34); g.setColor (Color.black);

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

public void init ()

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

display = нов Display ();

void setInfo (MouseEvent evt)

// задаване на информация за събитието да се показва

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

modifierKeys + = "Контрол"; if (evt.isMetaDown ())

modifierKeys + = "Мета"; if (evt.isAltDown ()) modifierKeys + = "Alt";

// Внедряване на всички интерфейсни методи MouseListener // и MouseMotionListener.

// Всеки метод задава стойност за eventType

// и извиква setInfo, за да получи информация за показване, public void mousePress (MouseEvent evt) < eventType = "mousePressed";

public void mouseReliased (MouseEvent evt) < eventType = "mouseReleased";

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

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

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

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

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

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

(Тук ще се покаже аплет "MouseMove"

ако Java беше на разположение.)

По принцип събитията с плъзгане и пускане се обработват с помощта на методите за обработка на събития mousePress (), mouseDragged (), mouseReleased (). Кодът може да изглежда по следния начин.

private int prevX, prevY; // мишката координира частно булево плъзгане; // е вярно, ако плъзнете

// все още се случва

public void mousePress (MouseEvent evt)

ако (искаме да започнем да влачим)

prevX = evt.getX (); // запомняме началната позиция

n други функции

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

плъзгане = невярно; // плъзгане завършено

// други функции и освобождаване на ресурс>

Типичен случай на използване за събития с плъзгане е рисуването. В този пример (Листинг 1.20) потребителят може да рисува цветно

криви, както и да изберете цвят, като щракнете върху съответния цветен квадрат, възможността за изчистване на полето за рисуване се осигурява чрез натискане на бутона Ochistim. Този пример съдържа други техники за програмиране на графики. Този аплет обаче не е лишен от недостатъка, че всичко изчертано изчезва, ако аплетът изчезне от зрителното поле, скривайки се зад друго приложение (фиг. 1.20).

setColor Color

Фигура: 1.20. Пример за чертеж на аплет

Кодът на аплета е във файла Risuem.java. Този аплет ви позволява да рисувате криви в различни цветове. Вдясно има набор от цветове. Можете да изберете цвят, като щракнете върху съответната цветна форма. Рисуването се извършва чрез натискане на бутона на мишката и преместване на мишката, докато държите бутона натиснат. Чертежът изчезва, когато аплетът е преоразмерен или след нов чертеж на предварително скрит аплет.

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

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

публичен клас Risuem разширява Applet

реализира MouseListener, MouseMotionListener < private final static int BLACK = 0,

ЧЕРВЕНО = 1, // константите съответстват на цветовете

private int currentColor = ЧЕРЕН; // текущ цвят на чертежа/*

променливите, дефинирани в този кодов фрагмент, се използват при изчертаване * /

private int prevX, prevY; // предишна позиция на мишката частно булево плъзгане; // вярно, ако плъзгането е все още

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

// използва се за изчертаване на криви

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

Запълнете зоната за рисуване с бяло.

Оставете три пиксела за границите и 56 пиксела за палитрата.

g.fillRect (3, 3, ширина - 59, височина - 6);

g.drawRect (0, 0, ширина-1, височина-1);

g.drawRect (1, 1, ширина-3, височина-3);

g.drawRect (2, 2, ширина-5, височина-5);

// 56px широк сив правоъгълник отдясно

g.fillRect (ширина - 56, 0, 56, височина);

fillRect (ширина-53, височина-53, 50, 50);

g.drawRect (ширина-53, височина-53, 49, 49);

g.рисунка ("Ochistim", ширина-48, височина-23);

111 палитра цветни правоъгълници

fillRect (ширина-53, 3 + 0 * colorSpacing, 50, colorSpacing-3); g.setColor (Color.red);

g.fillRect (ширина-53, 3 + l * colorSpacing, 50, colorSpacing-3); g.setColor (Color.green);

g.fillRect (ширина-53, 3 + 2 * colorSpacing, 50, colorSpacing-3); g.setColor (Color.blue);

g.fillRect (ширина-53, 3 + 3 * colorSpacing, 50, colorSpacing-3); g.setColor (Color.cyan);

g.fillRect (ширина-53, 3 + 4 * colorSpacing, 50, colorSpacing-3); g.setColor (Color.magenta);

g.fillRect (ширина-53, 3 + 5 * colorSpacing, 50, colorSpacing-3); g.setColor (Цвят.жълт);

g.fillRect (ширина-53, 3 + 6 * colorSpacing, 50, colorSpacing-3); // 2px граница около цветните правоъгълници на палитрата setColor (Color.white);

g.drawRect (ширина-55, 1 + currentColor * colorSpacing, 53, colorSpacing); g.drawRect (ширина-54, 2 + currentColor * colorSpacing, 51, colorSpacing-

private void changeColor (int y)

// промяна на цвета след щракване върху правоъгълника на палитрата

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

int височина = getSize (). височина; // височина

int colorSpacing = (височина - 56)/7; // височина на един правоъгълник

int newColor = y/colorSpacing; // номер на избрания цвят

if (newColor 6) // проверете номера на цвета

Премахване на светлината от стария правоъгълник. Променете текущия цвят на чертежа.

Изчертава подчертаване около правоъгълника с нов цвят. * /

Графика g = getGraphics (); g.setColor (Color.gray);

g.drawRect (ширина-55, 1 + currentColor * colorSpacing, 53, colorSpacing); g.drawRect (ширина-54, 2 + currentColor * colorSpacing, 51, colorSpacing-2); currentColor = newColor; g.setColor (Color.white);

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

калъф ЧЕРЕН: graphicsForDrawing.setColor (Color.black); почивка; калъф ЧЕРВЕН:

калъф ЗЕЛЕН: graphicsForDrawing.setColor (Color.green); почивка;

graphicsForDrawing.setColor (Color.blue); почивка; дело CYAN:

калъф MAGENTA: graphicsForDrawing.setColor (Color.magenta); почивка;

калъф ЖЪЛТ: graphicsForDrawing.setColor (Color.yellow);

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

int width = getSize (). width; // ширина на аплета int height = getSize (). height; // височина на аплета if (плъзгане == true) return; ако (x> ширина - 53) < // щелчок мыши правее области рисования if (у >височина - 53) пребоядисване (); // щракнете върху бутона за изчистване

changeColor (y); // промяна на цвета на боята>

if (y getSize (). височина - 4) y = getSize (). височина - 4; graphicsForDrawing.drawLine (prevX, prevY, x, y); // изчертаване на линия prevX = x;

public void mouseEntered (MouseEvent evt) < >public void mouseExited (MouseEvent evt) < >public void mouseClicked (MouseEvent evt) < >public void mouseMoved (MouseEvent evt)

Източник: Будилов В. А. Интернет програмиране в Java. - SPb.: BHV-Петербург, 2003. - 704 f.: Ил.