Назад
    Вперед 
    4.5. Работа с мышью в JDK 1.1
    Пример демонстрирует способы обработки
    событий от мыши в модели JDK версии 1.1. Рассказано о
    применении методов интерфейса MouseListener. 
    Исходный текст примера 
    Архив проекта для Java WorkShop 2.0  
    Демонстрация 
    (ваш браузер должен уметь работать с аплетами
    Java в стандарте JDK 1.1) 
    Немного теории 
    Для обработки событий от мыши в JDK 1.1
    предусмотрены два интерфейса - MouseListener и
    MouseMotionListener. Первый из них предназначен для
    обработки таких событий, как щелчок мышью внутри
    окна приложения Java, нажатие и отжатие клавиши
    мыши, вход курсора мыши в область экрана,
    занимаемую приложением и выход курсора из этой
    области. Второй интерфейс позволяет отслеживать
    перемещение курсора мыши.  
    В этом примере мы займемся интерфейсом MouseListener.
    Его регистрация выполняется при помощи метода
    addMouseListener.  
    Данный интерфейс предполагает реализацию
    следующих пяти методов:  
    
      
        | Метод | 
        Действие пользователя, в результате
        которого метод получает управление  | 
       
      
        | mousePressed | 
        Нажатие клавиши мыши | 
       
      
        | mouseReleased | 
        Отжатие клавиши мыши | 
       
      
        | mouseClicked | 
        Щелчок клавишей мыши в области окна
        приложения Java  | 
       
      
        | mouseEntered | 
        Размещение курсора мыши в области окна
        приложения Java  | 
       
      
        | mouseExited | 
        Вывод курсора мыши из области окна
        приложения Java  | 
       
     
    В качестве единственного параметра всем этим
    методам передается ссылка на объект класса
    MouseEvent, например:  
    public void mouseClicked(MouseEvent e)
{
}
    При помощи этой ссылки приложение Java может
    извлечь самую разнообразную информацию о мыши на
    момент возникновения события.  
    Методы getX и getY возвращают координаты курсора
    мыши относительно окна приложения Java в пикселах
    по горизонтали и вертикали, соответственно. С
    помощью метода getPoint вы можете получить эту же
    информацию в виде ссылки на объект класса Point.  
    Метод getClickCount пригодится вам в том случае, если
    приложение должно уметь отличать одиночные и
    многократные (например, двойные) щелчки клавишей
    мыши. Этот метод возвращает значение счетчика
    количества щелчков на момент возникновения
    события. Например, для двойного щелчка
    возвращается значение 2.  
    А как определить, какая клавиша мыши вызвала
    появление события?  
    Строго говоря, этого делать не рекомендуется.
    Дело в том, что количество кнопок на мыши
    отличается для разных компьютерных платформ. И
    если пользователи персональных компьютеров на
    базе процессоров Intel имеют дело с двух- или
    трехкнопочными мышами, то владельцы компьютеров
    Apple довольствуются всего лишь однокнопочными.  
    Поэтому для обеспечения мобильности
    приложения Java обычно работают только с одной
    кнопкой мыши. При этом если мышь многокнопочная,
    то все кнопки выполняют одну и туже функцию.  
    Тем не менее, если вы абсолютно уверены, что
    ваше приложение будет работать только с
    многокнопочными мышами, вы можете различать
    события от отдельных кнопок. Для этого следует
    воспользоваться методом getModifiers из класса InputEvent
    (который является базовым для класса MouseEvent).  
    Каким образом?  
    В зависимости от того, какая клавиша была
    нажата при возникновении события, метод getModifiers
    возвращает одно из следующих значений: 
    
      
        | Значение | 
        Клавиша мыши | 
       
      
        | InputEvent.BUTTON1_MASK | 
        Левая  | 
       
      
        | InputEvent.BUTTON2_MASK или InputEvent.ALT_MASK  | 
        Средняя | 
       
      
        | InputEvent.BUTTON3_MASK  или InputEvent.META_MASK   | 
        Правая | 
       
     
    Описание примера 
    В примере аплета мы демонстрируем обработку
    событий от разных клавиш мыши.  
    Окно аплета разделено сеткой на отдельные
    блоки прямоугольной формы (рис. 1).  
      
    Рис. 1. Окно аплета, работающего с мышью  
    Если сделать одиночный щелчок левой клавишей
    мыши внутри блока, его цвет станет зеленым.
    Повторный одиночный щелчок восстанавливает
    желтый цвет блока.  
    Двойной щелчок левой клавишей мыши
    перекрашивает блок в красный цвет, а одиночный
    щелчок правой клавишей мыши - в черный.  
    Рассмотрим теперь исходный текст аплета.  
    Класс MouseBox
    Главный класс аплета MouseBox реализует интерфейс
    MouseListener, позволяющий обрабатывать события от
    клавиш мыши:  
    import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class MouseBox extends Applet 
  implements MouseListener
{
  . . .
}
    В нем мы определили несколько полей и методов.  
    Поле dm хранит размеры окна аплета:  
    Dimension dm; 
    В полях nxBlockSize и nyBlockSize хранятся текущий размер
    блока в пикселах, соответственно, по горизонтали
    и по вертикали:  
    int nxBlockSize;
int nyBlockSize; 
    В поле nBlocks находится число блоков по вертикали
    и горизонтали:  
    static final int nBlocks = 10; 
    Следующие три двухмерных массива хранят
    состояние, количество щелчков мыши и значение
    флагов модификации для каждого блока:  
    boolean[][] bState;
int[][] nClickCount;
int[][] nMod; 
    Метод init
    Этот метод выполняет все необходимые
    инициализирующие действия.  
    Прежде всего он определяет и сохраняет размеры
    окна аплета:  
    dm = getSize(); 
    Далее исходя из этих размеров и количества
    блоков вычисляются размеры сторон блоков по
    горизонтали и вертикали:  
    nxBlockSize = dm.width / nBlocks;
nyBlockSize = dm.height / nBlocks; 
    На следующем шаге метод init создает три массива,
    предназначенные для хранения различных
    характеристик блоков:  
    bState = new boolean[nBlocks][nBlocks];
nClickCount = new int[nBlocks][nBlocks];
nMod = new int[nBlocks][nBlocks]; 
    Затем в цикле выполняется инициализация
    созданных массивов:  
    int i, j;
for(i = 0; i < nBlocks; i++)
{
  for(j = 0; j < nBlocks; j++)
  {
    bState[i][j] = false;
    nClickCount[i][j] = 0;
    nMod[i][j] = 0;
  }
}  
    В ячейки массива bState
    записывается значение false, что соответствует не
    закрашенному блоку. Ячейки остальных массивов
    инициализируются нулевыми значениями.  
    Далее метод init устанавливает цвет фона и
    изображения:  
    setBackground(Color.yellow);
setForeground(Color.black); 
    На последнем этапе метод init регистрирует
    интерфейс обработки событий от мыши MouseListener:  
    this.addMouseListener(this); 
    Метод paint
    Метод paint рисует в окне аплета блоки в том
    состоянии, которое записано в указанных выше
    трех массивах.  
    Однако вначале он разлиновывает окно алпета на
    блоки, используя для этого красный цвет:  
    g.setColor(Color.red);
    
for(int x = 0; x <= nBlocks; x++)
{
  g.drawLine(x * nxBlockSize, 0,
    x * nxBlockSize, dm.height);
}
    
for(int y = 0; y <= nBlocks; y++)
{
  g.drawLine(0, y * nyBlockSize,
    dm.width, y * nyBlockSize);
}
    Далее каждый блок закрашивается методом fillRect.  
    Для этого мы организовали двойной вложенный
    цикл:  
    for(int x = 0; x < nBlocks; x++)
{
  for(int y = 0; y < nBlocks; y++)
  {
    if(nClickCount[x][y] == 2)
      g.setColor(Color.red);
          
    else if(bState[x][y])
    {
      if(nClickCount[x][y] == 2)
        g.setColor(Color.red);
            
      else
      {  
        if(nMod[x][y] == InputEvent.META_MASK)
          g.setColor(Color.black);
        else  
          g.setColor(Color.green);
      }  
    }
    else
      g.setColor(Color.yellow);
          
    g.fillRect(
      x * nxBlockSize + 1,
      y * nyBlockSize + 1,
      nxBlockSize - 1, nyBlockSize - 1);
  }
}
    Прежде всего мы для каждого блока проверяем
    соответствующую ему ячейку массива bState.
    Когда пользователь делает щелчок мышью внутри
    блока, обработчик события записывает в эту
    ячейку значение true.  
    Далее мы выполняем действия, необходимые для
    того чтобы отличить двойные и одиночные щелчки.  
    Если внутри блока был сделан двойной щелчок, в
    контекст отображения перед раскрашиванием
    выбирается красный цвет:  
    if(nClickCount[x][y] == 2)
  g.setColor(Color.red);
else
{  
  if(nMod[x][y] == InputEvent.META_MASK)
    g.setColor(Color.black);
  else  
    g.setColor(Color.green);
}
    В противном случае мы проверяем флаг
    модификации, записанный обработчиком события в
    ячейку массива nMod.  
    Если он равен значению InputEvent.META_MASK (или
    InputEvent.BUTTON3_MASK), был сделан щелчок правой клавишей
    мыши. Мы в этом случае выбираем в контекст
    отображения черный цвет. Для щелчка левой
    клавишей мыши выбирается зеленый цвет.  
    Метод mousePressed
    Метод mousePressed получает управление, когда
    пользователь располагает курсор мыши внутри
    окна нашего аплета и нажимает одну из клавиш
    мыши.  
    Прежде всего этот метод определяет текущий
    координаты курсора мыши и пересчитывает их в
    номер блока:  
    int xClick = e.getX() / nxBlockSize;
int yClick = e.getY() / nyBlockSize; 
    Далее состояние ячейки массива bState,
    соответствующее этому блоку, изменяется на
    противоположное:  
    bState[xClick][yClick] = 
    !bState[xClick][yClick];
    В массив nClickCount мы записываем количество
    щелчков, сделанных внутри блока, а в массив nMod -
    флаги модификации, позволяющие определить, какой
    именно клавишей пользователь щелкнул в окне
    аплета:  
    nClickCount[xClick][yClick] = 
  e.getClickCount();
   
nMod[xClick][yClick] = e.getModifiers(); 
    Затем окно аплета перерисовывается:  
    repaint(); 
    Остальные методы интерфейса MouseListener 
    Эти методы необходимы нам только для полноты
    реализации интерфейса MouseListener, поэтому мы
    определили их пустыми:  
    public void mouseReleased(MouseEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
     
    Назад Вперед  |