Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Коды клавиш

Ввод символов
Аплеты JDK 1.1 и клавиатура
Аплет JDK 1.0 и клавиатура
Мышь в JDK 1.1
Перемещение объектов
Аплет JDK 1.0 и мышь
Регулируем размер изображения
Автономное приложение и мышь

Назад Вперед

4.8. Регулируем размер изображения

Пример демонстрирует способы обработки событий, возникающих при перемещении курсора мыши в модели JDK версии 1.0.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java)

Немного теории

В этом примере мы сосредоточим свое внимание на обработке событий, возникающих при выполнении операции перемещения мышью объектов в окне аплета. При этом мы используем модель обработки событий из JDK версии 1.0.

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

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

Описание примера

В левом верхнем углу окна аплета нарисована дискета небольшого размера (рис. 1).

pic1.gif (2409 bytes)

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

Если ухватить мышью правый нижний край дискеты (в области черного квадрата), то можно произвольным образом растягивать или сжимать изображение дискеты (рис. 2).

pic2.gif (5967 bytes)

Рис. 2. Мы растянули изображение дискеты

В процессе изменения размеров дискеты около курсора появляется небольшое перекрестие, которое можно заметить на рис. 2.

Рассмотрим исходные тексты аплета.

Класс AnySize

В этом классе, созданном на базе класса Applet, мы определили несколько полей и методов:

import java.applet.Applet;
import java.awt.*;

public class AnySize extends Applet
{
  . . .
}

Поле imFloppy хранит ссылку на изображение дискеты:

Image imFloppy;

Следующие два поля хранят, соответственно, высоту и ширину изображения дискеты:

int imHeight;
int imWidth;

В поле dm хранится размер окна аплета:

Dimension dm;

Флаг bBeginDrag устанавливается, когда пользователь начинает изменять размер изображения дискеты, и сбрасывается по окончании этого процесса:

boolean bBeginDrag = false;

И, наконец, в поле rcImageCorner хранятся координаты маленького черного квадрата, предназначенного для растягивания или сжимания изображения дискеты:

Rectangle rcImageCorner;

Метод init

Сразу после запуска метод init загружает изображение дискеты, дожидается завершения этого процесса и затем определяет размеры изображения:

MediaTracker tr = new MediaTracker(this);
    
imFloppy = getImage(getCodeBase(),
  "disk.gif");
tr.addImage(imFloppy, 0);
try
{
  tr.waitForAll();
}
catch (InterruptedException e) {}
    
imHeight = imFloppy.getHeight(this);
imWidth = imFloppy.getWidth(this);

Затем он получает размеры окна аплета:

dm = size();

Обратите внимание на то что здесь мы использовали метод size из JDK версии 1.0, а не метод getSize из JDK версии 1.1.

Последнее действие - установка цвета фона и изображения:

setBackground(Color.white);
setForeground(Color.black);

Метод paint

Прежде всего этот метод рисует рамку вокруг окна аплета:

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

Затем он рисует изображение дискеты:

g.drawImage(imFloppy, 0, 0, 
  imWidth, imHeight, this);

Размеры этого изображения определяются содержимым полей imWidth и imHeight. Сразу после запуска аплета эти размеры взяты из исходного файла с именем disk.gif. Затем пользователь может изменить их.

Далее метод paint рисует маленький квадратик черного цвета в правом нижнем углу изображения дискеты:

g.fillRect(imWidth - 5, imHeight - 5, 5, 5);

Расположение этого квадратика сохраняется в поле rcImageCorner:

rcImageCorner = new Rectangle(
  imWidth - 5, imHeight - 5, 5, 5);

Если аплет находится в состоянии изменения размеров рисунка дискеты, установлен флаг bBeginDrag. В этом случае метод paint рисует около курсора мыши перекрестие черного цвета. Если же данная операция не выполняется, перекрестие рисуется белым цветом (то есть стирается):

if(bBeginDrag)
  g.setColor(Color.black);
else      
  g.setColor(Color.white);
      
g.drawLine(imWidth - 15, imHeight,
  imWidth + 15, imHeight);
        
g.drawLine(imWidth, imHeight - 15, 
  imWidth, imHeight + 15);

Метод mouseDown

Когда пользователь нажимает клавишу мыши, метод mouseDown проверяет, находится ли при этом курсор мыши в области черного квадрата:

public boolean mouseDown(Event e, 
  int x, int y)
{
  bBeginDrag = 
    rcImageCorner.contains(x, y);
      
  return true;
}

Если да, то устанавливается флаг bBeginDrag.

Метод mouseUp

После завершения процедуры изменения размера изображения дискеты пользователь отпускает клавишу мыши. При этом управление получает метод mouseUp:

public boolean mouseUp(Event e, 
  int x, int y)
{
  bBeginDrag = false;
  repaint();
  return true;
}

Он сбрасывает флаг bBeginDrag и перерисовывает окно аплета. Последняя операция приводит к стиранию перекрестия.

Метод mouseDrag

Задача этого метода - изменение размеров изображения при изменении расположения курсора мыши. Новые размеры записываются в поля imHeight и imWidth. Эта операция выполняется, однако, только при установленном флаге bBeginDrag:

public boolean mouseDrag(Event e, 
  int x, int y)
{
  if(bBeginDrag)
  {
    imHeight = y;
    imWidth = x;
  
    repaint();
  }  
  return true;
}

Перед завершением своей работы метод перерисовывает окно аплета.


Назад Вперед

[Назад]