Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

4.3 Апплет, обрабатывающий события

Создадим апплет MouseEvent (пример 7), отображающий положение курсора мыши с помощью вывода графического изображения в точке. Включение и выключение режим слежения происходит при нажатии на клавишу мыши.

При создании шаблона апплета с помощью системы Java Applet Wizard необходимо в третьей диалоговой панели дать возможность системе сгенерировать заготовки методов-обработчиков нажатия на клавишу и перемещение мыши - в исходный текст апплета будут включены заготовки соответствующих методов-обработчиков. Тексты подобных шаблонных файлов содержатся в Приложении 3 и их можно в дальнейшем использовать в качестве шаблонов апплета, обрабатывающего простые сообщения от мыши.

В каталог, где содержится файл исходного текста, следует поместить файл с изображением arrow.gif

Для хранения состояния класса MouseEvent объявить в классе переменные:

private int m_x=0, m_y=0; // текущее положения курсора

private boolean follow=true; // режим отслеживания включен/выключен

Image imageCur; // переменная для граф. изображения

Для загрузки графического изображения из файла того же каталога, где располагается файл класса MouseEvent, можно использовать следующий фрагмент, помещаемый в метод init() класса MouseEvent:

try

{ imageCur=getImage(new java.net.URL(getCodeBase(),"arrow.gif"));

}

catch(java.net.MalformedURLException e)

{ // код здесь выполняется, если строка URL неправильна

imCur=createImage(0,0); // создание пустого изображения

}

Для прорисовки изображения апплета вызывается метод paint(), его следует переопределить в классе MouseEvent следующим образом:

public void paint(Graphics g)

{ // рамка вокруг окна апплета

Dimension size=size(); // размер компонента (окна апплета)

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

// прорисовка изображения

g.drawImage(imageCur,m_x,m_y,this)

}

За обработку такого события, как перемещение мыши, отвечает метод mouseMove(). В этом методе необходимо сохранить текущие координаты мыши и перерисовать окно апплета:

public boolean mouseMove(Event evt, int x, int y)

{ if(follow) // если режим отслеживания

{ m_x=x; m_y=y; // сохранение координат

repaint(); // перерисовка окна

}

return true;

}

Режим слежения за курсором включается и выключается при нажатии, поэтому следует изменить метод mouseDown() следующим образом:

public boolean mouseDown(Event evt, int x, int y)

{ follow=!follow;

return true;

}

4.4 Устранение мерцания при выводе, двойная буферизация

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

Когда оболочка времени выполнения должна повторно перерисовывать графические окна - например, когда окно было затенено или когда апплету требуется повторно перерисовать свое окно, - вызывается метод модификации апплета update() и передается объект Graphics графического экрана. Этот метод по умолчанию просто передает полученный объект Graphics методу paint().

Апплет запрашивает перерисовку окна методом repaint(),который в свою очередь как можно скорее вызывает метод модификации update(). Если апплет запрашивает другую перерисовку, прежде чем метод модификации вызвался из первой, апплет модифицируется только в первый раз. Воспользуемся именно эти свойством методом update() для формирования изображения в памяти и вывода его в окно вместо простого разрешения выводить изображение в апплет прямо в окно.

Модифицируем апплет MouseEvent (пример 8), так чтобы эффект мерцания был устранен. В апплете нужно определить ссылки на виртуальный экран и его контекст отображения:

// изображение (виртуальный экран)

private Image OffScreenImage;

// контекст отображения (интерфейс) изображения

private Graphics OffscreenGraphics;

Для создания объектов этих типов добавим следующий фрагмент в метод init() после кода загрузки картинки из файла arrow.gif:

// пустое изображение (виртуальный экран)

OffScreenImage=createImage(size().width,size().height);

// получение контекста отображения для OffScreenImage

OffscreenGraphics=OffScreenImage.getGraphics();

В этом фрагменте создается пустое изображение размером с окно апплета (виртуальный экран). Объект OffscreenGraphics - это контекст для вывода в OffScreenImage. Апплет будет при помощи этого контекста рисовать на виртуальном экране с такой скоростью, с какой только сможет. Метод модификации update(), переопределяемый в апплете выводит изображение на объект Graphics с такой скоростью, с какой только сможет:

public void update(Graphics g)

{ // перерисовать виртуальный экран,

// то есть изображение OffScreenImage

paint(OffscreenGraphics);

// вывести изображение OffScreenImage в окно

g.drawImage(OffScreenImage,0,0,this);

}

Переопределим также и метод paint(), теперь он может, используя передаваемый ему контекст, выводить изображение на виртуальный экран при вызове его из метода update(), когда сам апплет требует перерисовки методом repaint(), так и при вызове его системой тогда, когда для окна требуется перерисовка в связи с его перекрытиями другими окнами:

public void paint(Graphics g)

{

g.setColor(Color.gray);

g.fillRect(0,0,size().width-1,size().height-1);

g.setColor(Color.black);

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

g.drawImage(imageCur,m_x,m_y,this);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]