Приведение - это просто изменение ссылки объекта на другое представление, а не преобразование объекта в объект другого типа.
Приведя пример с некоторыми составными классами, вы можете привести Shape к квадрату, если Shape уже фактически является квадратом:
Shape shape = new Square();
Square square = (Square) s; // this will be okay!
Это просто разоблачение существующего дополнительного поведения объекта, связанного с тем, что он является квадратом, а не преобразование его в квадрат. Вы не можете сделать это, например:
Shape shape = new Square();
Circle circle = (Circle) shape; // this will throw a ClassCastException
Поскольку форма на самом деле не является кругом с самого начала, и вы могли бы потенциально продемонстрировать поведение (например, getPerimeter ()), которое на самом деле не имело бы смысла для базового объекта.
Точно так же, в вашем случае, Shape не является Компонентом, и его никогда не будет, поэтому вы не можете привести его в единое целое. Вы не можете выполнить приведение к раскрытию поведения, связанного с Компонентами (добавление слушателей), потому что это поведение не поддерживается классом Shape. Класс shape не будет получать сообщения о событиях от интерфейса, даже если имеет смысл добавить к нему прослушиватель, поскольку он не был добавлен в интерфейс в качестве компонента с самого начала. Предположительно вы рисуете фигуры на компоненте вручную, поэтому вы уже должны понимать, что они не являются частью иерархии компонентов.
Как вы и предлагали, лучший способ справиться с этим, предполагая, что вы уже достигли точки, где фигуры рисуются внутри компонента, - это вручную проверить, что координаты x и y соответствующего MouseEvent находятся внутри каждой фигуры. .
Если вы хотите с самого начала рассматривать их как Компоненты, вам придется создавать Компоненты для каждой фигуры и добавлять их в Контейнер с помощью LayoutManager, так же, как вы строите остальную часть интерфейса. Это предполагает создание «пользовательского компонента», как вы сказали, который вместо того, чтобы называть класс или метод, готовый к использованию, означает создание собственного подкласса компонента, который может, возможно, принять аргумент Shape в своем конструктор. Вот пример Я нашел для создания пользовательской кнопки Компонент круглой формы, который с некоторыми изменениями должен отвечать вашим потребностям.
Вы в основном ответили на свой вопрос по большей части в своем последнем комментарии, надеюсь, это поможет вам понять, как:).
Ура, надеюсь, это помогло.