Домашнее задание: реализовать Paint и показать получившийся резальтат на уроке 14 января.

Описание

Ваша цель сделать Paint с тремя режимами рисования мышкой:

Paint

Справа три кнопки для выбора одного из вариантов рисования:

  • Точками в местах где был курсор при зажатой левой кнопке (или рисовать не точку а картинку - см. предыдущее задание про Шарик и кнопки)
  • Отрезками соединяющими два последовательных местах где был курсор при зажатой левой кнопке
  • Прямоугольник чей первый угол определяется местом где был курсор при нажатии на левую кнопку мыши и чей последний угол определяетс местом где был курсор при отпускании левой кнопки мыши

Как обрабатывать нажатия и движения мышки:

Такого рода вещи тоже легко гуглятся - “java swing как обрабатывать нажатия мышки”.

Окажется что все аналогично тому, что было проделано с MyPauseListener в задании про Шарик и кнопки.

Отличия:

1) Добавлять слушателя нужно на панель на которой мы хотим рисовать (через метод panel.addMouseListener(MouseListener)).

2) Чтобы узнать например в методе public void mouseClicked(MouseEvent e) в каком именно месте находится мышка - нужно вызвать у аргумента MouseEvent e соответствующие геттеры:

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("Mouse click on (x=" + e.getX() + ", y=" + e.getY() + ")");
}

Чтобы обрабатывать не только клики, но и передвижения мышки, можно воспользоваться методом panel.addMouseMotionListener.

Как реализовать переключение между разными режимами рисования:

Есть три режима рисования. Давайте текущий режим рисования хранить в поле int drawingMode нашей панели. И давайте договоримся сами с собой что когда drawingMode равен 1 мы рисуем точки, когда 2 - отрезки, когда 3 - прямоугольник.

Тогда нажатие кнопки справа должно просто менять значение режима рисования.

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

Т.о. обработка событий движения мышки должна принять вид чего-то подобного:

@Override
void mouseDragged(MouseEvent e) {
    if (drawingMode == 1) {
        // В первом режиме рисования мы просто запоминаем текущее положение курсора как еще один кружочек который надо нарисовать
        pointsXs.add(e.getX());
        pointsYs.add(e.getY());
    } else if (drawingMode == 2) {
        // Во втором режиме рисования мы соединяем предыдущее и следующее местоположение мышки
        segmentsXs.add(previousX);
        segmentsYs.add(previousY);
        segmentsXs.add(e.getX());
        segmentsYs.add(e.getY());
    } else if (drawingMode == 3) {
        // Ничего не делаем, т.к. прямоугольник мы обработаем в mousePressed и mouseReleased
    }
}

void mousePressed(MouseEvent e) {
    if (drawingMode == 3) {
        rectanglesXs.add(e.getX());
        rectanglesYs.add(e.getY());
    }
}

void mouseReleased(MouseEvent e) {
    if (drawingMode == 3) {
        rectanglesXs.add(e.getX());
        rectanglesYs.add(e.getY());
    }
}