В заключение темы, посвященной событиям, рассмотрим пример приложения, которое активно их использует.
Попробуем написать примитивный графический редактор, который позволяет рисовать с помощью курсора – если перемещать его с нажатой кнопкой мыши, то будет появляться линия. Нажатие пробела очищает поле.
import java.awt.*; import java.awt.event.*; public class DrawCanvas extends Canvas { private int lastX, lastY; private int ex, ey; private boolean clear=false;
public DrawCanvas () { super(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { lastX = e.getX(); lastY = e.getY(); } });
addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { ex=e.getX(); ey=e.getY(); repaint(); } });
addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { if (e.getKeyChar()==' ') { clear = true; repaint(); } } }); }
public void update(Graphics g) { if (clear) { g.clearRect(0, 0, getWidth(), getHeight()); clear = false; } else { g.drawLine(lastX, lastY, ex, ey); lastX=ex; lastY=ey; } } public static void main(String s[]) { final Frame f = new Frame("Draw"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { f.dispose(); } }); f.setSize(400, 300);
final Canvas c = new DrawCanvas(); f.add(c);
f.setVisible(true); } }
Класс DrawCanvas и является тем полем, на котором можно рисовать. В его конструкторе инициализируются все необходимые слушатели. В случае прихода события инициализируется перерисовка (метод repaint), логика которой описана в update. Запускаемый метод main инициализирует frame, не забывая про windowClosing.
В результате можно что-нибудь нарисовать: