if ((e.getModifiers() & MouseEvent.BUTTON1 MASK) == 0) return; lastX = e.getX(); lastY = e.getY();
}
public void mouseDragged(MouseEvent e){
if ((e.getModifiers() & MouseEvent.BUTTON1 MASK) == 0) return;
Graphics g = getGraphics(); g.setColor(currColor);
g.drawLine(lastX, lastY, e.getX(), e.getY());
lastX = e.getX(); lastY = e.getY();
}
public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){}
}
Рис. 15.3. Пример работы с программой рисования |
2. Реализуйте оставшиеся методы интерфейсов-слушателей событий мыши.
Классы-адаптеры
public abstract class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseWheelMoved(MouseEvent e){}
}
public abstract class MouseMotionAdapter implements MouseMotionListener{ public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){}
}
Вместо того чтобы реализовать интерфейс, можно расширять эти классы. Не бог весть что, но полезно для создания безымянного вложенного класса, как у нас и делалось для закрытия окна. Там мы использовали класс-адаптер WindowAdapter.
Классов-адаптеров всего семь. Кроме уже упомянутых трех классов, это классы
ComponentAdapter, ContainerAdapter, FocusAdapter и KeyAdapter.
Управление колесиком мыши
Колесико, дополняющее среднюю кнопку мыши, очень удобно и популярно. Его использование встроено в Java SE, начиная с версии JDK 1.4, и применяется, например, в контейнере JScrollPane. Если же разработчику нужно создать свой компонент, в котором прокрутка осуществляется колесиком мыши, то он может задать обработку события MouseWheelEvent.
Класс MouseWheelEvent расширяет класс MouseEvent, следовательно, содержит все его поля и методы. Дополнительно он различает два типа прокрутки: прокрутку блока, отмечаемую статическим полем wheel_block_scroll, и прокрутку одной единицы — статическое поле wheel_unit_scroll. Тип прокрутки, а также смысл понятий "блок" и "единица" определяется графической оболочкой операционной системы и возвращается методом getScrollType (). Например, блок — это страница текста, а единица — одна строка.
Если тип прокрутки WHEEL_UNIT_SCROLL, то метод getUnitsToScroll() возвращает количество прокрученных единиц с учетом направления вращения колесика: на себя — положительное число, от себя — отрицательное. Метод getScrollAmount () возвращает то же число без знака. Конкретное значение зависит от платформы.
Если же разработчик не хочет использовать понятие "единица", то он может методом getWheelRotation () отследить количество "щелчков", сделанных колесиком во время прокрутки. При этом положительное число возвращается при повороте колесика на себя и означает прокрутку вниз, а отрицательное — при повороте колесика от себя, прокрутка вверх.
Интерфейс MouseWheelListener описывает один метод
public void mouseWheelMoved(MouseWheelEvent e);
которому передается объект-событие, происшедшее в результате вращения колесика мыши. В листинге 15.5 приведен тренировочный пример работы с колесиком мыши.
import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class WheelEv extends JFrame
implements MouseWheelListener{
JTextArea ta = new JTextArea(5, 30);
WheelEv(){
super(" Колесико мыши"); getContentPane().add(ta);
ta.addMouseWheelListener(this); setSize(400, 400);
setDefaultCloseOperation(EXIT ON CLOSE); setVisible(true);
}
public void mouseWheelMoved(MouseWheelEvent e){
if (e.getScrollType() == MouseWheelEvent.WHEEL UNIT SCROLL) ta.append(" Единицы = " + e.getUnitsToScroll() +
" Количество = "+ e.getScrollAmount() +
" Вращение = " + e.getWheelRotation() + "\n");
}
public static void main(String[] args){ new WheelEv();
}
}
Рисунок 15.4 показывает конкретные значения, полученные этой программой в операционной системе Windows XP.
Рис. 15.4. Значения, полученные от колесика мыши |