Вот что я бы сделал:
Ellipse2D case:
Каждый раз, когда вы хотите увидеть, коснулась ли ваша мышь края Ellipse2D, создайте Ellipse2D, который немного больше оригинала, и Ellipse2D, который немного меньше. Если ваша точка щелчка мыши находится внутри большего Ellipse2D, но вне меньшего, то вы щелкнули «близко» к краю исходной формы.
Rectangle2D case:
Решите это так же, как Ellipse2D - сделайте одну больше, одну поменьше, и определите, находится ли ваша мышь внутри большей, но снаружи меньшей.
корпус Line2D:
Создайте Rectangle2D, который окружает ваш Line2D некоторой заданной шириной. Затем посмотрите, находится ли ваша мышь внутри этого Rectangle2D.