Оглавление

События
Обработка событий
События от мыши
Аплет LineDraw
Исходный текст
Описание текста

    Описание исходного текста

    В нашем аплете мы будем создавать объект класса Vector, который является массивом с динамически изменяемым размером. Здесь мы будем хранить координаты нарисованных линий.

    Класс Vector имеет полное имя java.util.Vector, поэтому мы подключаем соответствующую библиотеку классов:

    import java.util.*;

    Поля класса LineDraw

    В нашем классе мы определили несколько полей, предназначенных для хранения текущих координат рисуемых линий:

    Dimension dmDown;
    
    Dimension dmUp;
    
    Dimension dmPrev;
    
    boolean   bDrawing;
    
    Vector    lines;

    В переменную dmDown класса Dimension записываются координаты курсора на момент нажатия клавиши мыши. Если пользователь нажал клавишу мыши для того чтобы приступить к рисованию линии, это будет координатами начала линии.

    Когда пользователь отпускает клавишу мыши, координаты записываются в переменную dmUp.

    В процессе рисования линии метод mouseDrag стирает ранее нарисованную линию и рисует новую. Координаты конца старой линии хранятся в переменной dmPrev.

    Переменная bDrawing типа boolean хранит текущее состояние аплета. Когда аплет находится в состоянии рисования линии, в эту переменную записывается значение true, а когда нет - значение false.

    И, наконец, переменная lines типа Vector является динамическим массивом, в котором хранятся координаты нарисованных линий.

    Метод getAppletInfo

    Метод getAppletInfo возвращает название аплета и не имеет никаких особенностей.

    Метод init

    Метод init сбрасывает признак рисования, записывая в поле bDrawing значение false, а также создает новый динамический массив в виде объекта класса Vector:

    public void init()
    
    {
    
      bDrawing = false;
    
      lines = new Vector();
    
    }

    Метод paint

    После изменения цвета фона и рисования рамки метод paint перебирает в цикле все элементы массива lines, рисуя линии:

    for(int i=0; i < lines.size(); i++) 
    
    {
    
      Rectangle p = 
    
        (Rectangle)lines.elementAt(i);
    
    
    
      g.drawLine( p.width, p.height, p.x, p.y);
    
    
    
      g.drawString("<" + p.width + "," 
    
        + p.height + ">", 
    
        p.width, p.height);
    
    
    
      g.drawString("<" + p.x + "," +
    
        p.y+ ">", p.x, p.y);
    
    }

    Для объектов класса Vector метод size возвращает количество элементов в массиве, чем мы воспользовались для проверки условия выхода из цикла.

    Чтобы извлечь элемент массива по его номеру, мы применили метод elementAt, передав ему через единственный параметр номер извлекаемого элемента.

    Так как в массиве хранятся объекты класса Rectangle, перед инициализацией ссылки p мы выполняем явное преобразование типов.

    Координаты концов линий рисуются с помощью уже знакомого вам метода drawString.

    Перед завершением работы метод paint сбрасывает признак рисования, записывая в поле bDrawing значение false:

    bDrawing = false;

    Метод mouseDown

    В начале своей работы метод mouseDown определяет, был ли сделан одинарный щелчок клавишей мыши, или двойной. Если был сделан двойной щелчок мышью, метод удаляет все элементы из массива list, а затем перерисовывает окно аплета, вызывая метод repaint:

    lines.removeAllElements();
    
    repaint();

    После перерисовки окно аплета очищается от линий.

    Если же был сделан одинарный щелчок клавишей мыши, метод mouseDown сохраняет текущие координаты курсора в переменных dmDown и dmPrev, а затем сбрасывает признак рисования:

    dmDown = new Dimension(x, y);
    
    dmPrev = new Dimension(x, y);
    
    bDrawing = false;

    Метод mouseUp

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

    dmUp = new Dimension(x, y);
    
    lines.addElement(
    
      new Rectangle(dmDown.width, 
    
      dmDown.height, x, y));
    
    repaint();

    После добавления элемента в массив метод mouseUp инициирует перерисовку окна аплета, вызывая для этого метод repaint.

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

    Метод mouseDrag

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

    Для того чтобы нарисовать что-либо в окне аплета, наобходимо получить контекст отображения. Методу paint этот контекст передается через парметр как объект класса Graphics. Если же вы собираетесь рисовать в другом методе, отличном от paint, необходимо получить контекст отображения, например, так:

    Graphics g = getGraphics();

    После получения контекста отображения и включения режима рисования (записью в переменную bDrawing значения true) метод mouseDrag стирает линию, которая была нарисована ранее, в процессе предыдущего вызова этого же метода:

    g.setColor(Color.yellow);
    
    g.drawLine(dmDown.width, dmDown.height, 
    
       dmPrev.width, dmPrev.height);

    Для стирания линии мы рисуем ее на том же месте с использованием цвета, совпадающего с цветом фона.

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

    g.setColor(Color.black);
    
    g.drawLine(dmDown.width, 
    
      dmDown.height, x, y);

    После рисования линии координаты ее конца сохраняются в поле dmPrev для стирания этой линии при следующем вызове метода mouseDrag:

    dmPrev = new Dimension(x, y);
    
    return true;

    Метод mouseMove

    Метод mouseMove не делает ничего, за исключением того, что он отключает режим рисования. Таким образом, простое перемещение курсора мыши над окном аплета не приводит к рисованию линий.



Java | Продукты и решения | Технологии | Сервис и обучение
О компании | Партнеры | Новости | Поиск
Sun Microsystems Inc. Corporate Information Our partners News and Events Search on site Java Computing Products and Solutions Technologies and Researches Education and Service Content
Используются технологии uCoz