Я создал библиотеку разметки холста в Java несколько лет назад, и если вам не нужно беспокоиться о преобразованиях на холсте (масштабирование, вращение и т. Д.), Это очень легко сделать.
По сути, вам просто нужно поддерживать коллекцию фигур холста в списке (а не в наборе, потому что порядок Z, вероятно, важен). Мышь слушателя будет на вашем холсте, а не на отдельных фигурах. Добавьте новые элементы в начало вашей коллекции (или повторите список позже).
Когда холст получает событие нажатия мыши, итерация по вашей коллекции фигур, пока вы не найдете тот, который находится под вашими координатами мыши. Самый простой способ сделать это состоит в том, чтобы ваши фигуры реализовали интерфейс, который определяет своего рода метод hitPoint (int x, int y). Таким образом, ваши прямоугольники могут реализовывать функции contains (), линии могут пересекать () или графические пути, вы можете учитывать некоторые отступы и т. Д.
Если сделать еще один шаг вперед, ваши фигуры должны определить собственный метод рисования (Graphics2D g), чтобы вы могли легко делать такие вещи, как поля выбора или установить режим рисования на XOR, чтобы облегчить «перемещение» фигуры. Метод paintComponent вашего холста должен был бы просто перебирать вашу коллекцию фигур, вызывая shape.draw (g) для каждой, передавая экземпляр графики, предоставленный методу paintComponent.