Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 1© Александр Фролов, Григорий ФроловТом 30, М.: Диалог-МИФИ, 1997, 288 стр. Приложение MouseClickАплет MouseClick демонстрирует обработку событий, поступающих от мыши. Когда мы создавали проект этого аплета, то в третьей диалоговой панели системы Java Applet Wizard включили три переключателя в поле Which mouse event handlers would you like added (рис. 4.1). Рис. 4.1. Включение обработчиков событий от мыши В результате в исходный текст приложения были добавлены перечисленные выше методы, обрабатывающие события, создаваемые мышью. Мы изменили эти методы таким образом, чтобы в ответ на различные действия, выполняемые пользователем с помощью мыши, аплет реагировал соответствующим образом:
Внешний вид окна аплета, в котором отображаются координаты курсора, показан на рис. 4.2. Рис. 4.2. Внешний вид окна аплета MouseClick, в котором отображаются координаты курсора Исходные тексты приложенияФайл исходного текста приложения MouseClick представлен в листинге 4.1. Листинг 4.1. Файл MouseClick\MouseClick.java // ========================================================= // Обработка событий от мыши // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ========================================================= import java.applet.*; import java.awt.*; public class MouseClick extends Applet { // Текущие координаты курсора при нажатии на // кнопку мыши Dimension dimMouseCursor; // Временная переменная для хранения события Event ev; // ------------------------------------------------------- // getAppletInfo // Метод, возвращающей строку информации об аплете // ------------------------------------------------------- public String getAppletInfo() { return "Name: MouseClick\r\n" + "E-mail: frolov@glas.apc.org" + "WWW: http://www.glasnet.ru/~frolov" + "Author: Alexandr Frolov\r\n" + "Created with Microsoft Visual J++ Version 1.0"; } // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры окна аплета Dimension dimAppWndDimension = size(); // Выбираем в контекст отображения желтый цвет g.setColor(Color.yellow); // Закрашиваем внутреннюю область окна аплета g.fillRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Выбираем в контекст отображения черный цвет g.setColor(Color.black); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Отображаем текущие координаты курсора мыши // в точке, где находится этот курсор g.drawString("(" + ev.x + "," + ev.y + ")", ev.x, ev.y); } // ------------------------------------------------------- // mouseDown // Обработка щелчка кнопкой мыши // ------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { // Определяем и сохраняем текущие координаты // курсора мыши dimMouseCursor = new Dimension(x, y); // Сохраняем событие во временной переменной ev = evt; // Если количествао щелчков больше 1, считаем что // сделан двойной щелчок if(evt.clickCount > 1) // Выводим сообщение о двойном щелчке showStatus("Mouse Double Click"); // Сделан одиночный щелчок else // Выводим сообщение о простом щелчке showStatus("Mouse Down"); // Перерисовываем окно аплета repaint(); // Возвращаем значение true при успешной // обработке события return true; } // ------------------------------------------------------- // mouseUp // Отпускание клавиши мыши // ------------------------------------------------------- public boolean mouseUp(Event evt, int x, int y) { // Выводим сообщение в строке состояния showStatus("Mouse Up"); return true; } // ------------------------------------------------------- // mouseDrag // Перемещение курсора мыши при нажатой клавише // ------------------------------------------------------- public boolean mouseDrag(Event evt, int x, int y) { // Выводим сообщение в строке состояния showStatus("Mouse Drag"); return true; } // ------------------------------------------------------- // mouseMove // Перемещение курсора мыши при отжатой клавише // ------------------------------------------------------- public boolean mouseMove(Event evt, int x, int y) { return true; } // ------------------------------------------------------- // mouseEnter // Курсор мыши вошел в область окна аплета // ------------------------------------------------------- public boolean mouseEnter(Event evt, int x, int y) { // Выводим сообщение в строке состояния showStatus("Mouse pointer enters applet's window"); return true; } // ------------------------------------------------------- // mouseExit // Курсор мыши покинул область окна аплета // ------------------------------------------------------- public boolean mouseExit(Event evt, int x, int y) { // Выводим сообщение в строке состояния showStatus("Mouse pointer leaves applet's window"); return true; } } Исходный текст документа HTML, созданного для нашего аплета системой Java Applet Wizard, приведен в листинге 4.2. Листинг 4.2. Файл MouseClick\MouseClick.html <html> <head> <title>MouseClick</title> </head> <body> <hr> <applet code=MouseClick.class id=MouseClick width=320 height=240 > </applet> <hr> <a href="MouseClick.java">The source.</a> </body> </html> Описание исходного текстаВ исходном тексте класса MouseClick мы определили поля класса с именами dimMouseCursor и ev: Dimension dimMouseCursor; Event ev; Первое из них предназначено для хранения координат курсора в момент возникновения события, а второе - хранит ссылку на это событие. Метод getAppletInfoМетод getAppletInfo ничем не отличается от аналогичных методов в предыдущих приложениях. Метод paintВ начале своей работы метод paint определяет текущие размеры окна аплета, закрашивает это окно в желтый цвет и рисует вокруг него тонкую рамку черного цвета. Все это делается исключительно для того чтобы выделить аплет в документе HTML и обозначить его границы. Далее метод paint отображает текущие координаты курсора мыши, взяв их из переменной ev: g.drawString("(" + ev.x + "," + ev.y + ")", ev.x, ev.y); Метод mouseDownКогда пользователь делает щелчок левой клавишей мыши (напомним, что Java не работает с другими клавишами мыши), управление получает метод mouseDown. Этот метод, переопределенный в нашем приложении, прежде всего сохраняет текущие координаты курсора мыши в переменной dimMouseCursor класса Dimension: dimMouseCursor = new Dimension(x, y); Событие, которое передается методу mouseDown через первый параметр, сохраняется в переменной ev: ev = evt; Далее метод mouseDown проверяет поле clickCount параметра evt: if(evt.clickCount > 1) showStatus("Mouse Double Click"); else showStatus("Mouse Down"); В это поле записывается кратность щелчка мыши. Если пользователь сделал двойной щелчок, в строке состояния отображается текстовая строка Mouse Double Click, а если одинарный - строка Mouse Down. Обратите внимание на метод showStatus. Этот метод позволяет аплету отобразить любую текстовую строку в строке состояния навигатора, поэтому он часто используется для отладки или выдачи текущей информации о состоянии аплета. Заметим, однако, что в документе HTML может располагаться несколько разных аплетов, а строка состояния навигатора только одна. Поэтому сообщения от разных аплетов могут перекрывать друг друга, в результате чего в строке состояния появится только то сообщение, которое было записано туда последним. После записи сообщения в строку состояния метод mouseDown перерисывывает окно аплета, вызывая для этого метод repaint: repaint(); В результате вызова метода repaint происходит инициирование вызова метода paint, выполняющего перерисовку содержимого окна аплета. Однако не следует думать, будто метод repaint просто вызывает метод paint. Метод paint вызывается интерпретатором Java асинхронно по отношению к методу repaint в подходящий момент времени. В последней строке метод mouseDown возвращает значение true: return true; Этим он сообщает, что обработка события завершена и это событие не нужно передавать обработчику из базового класса. Методы mouseUp, mouseDrag, mouseEnter, mouseExitОбработчики методов mouseUp, mouseDrag, mouseEnter и mouseExit выглядят одинаково: public boolean mouseUp(Event evt, int x, int y) { // Выводим сообщение в строке состояния showStatus("Mouse Up"); return true; } Пользуясь методом showStatus, эти методы записывают соответствующее сообщение в строку состояния и возвращают значение true. Метод mouseMoveМетод mouseMove выглядит следующим образом: public boolean mouseMove(Event evt, int x, int y) { return true; } Он ничего не делает, кроме того что возвращает значение true, блокируя обработку события, выполняемую в базовом классе. |