Тип приведения формы в компонент в Java? - PullRequest
1 голос
/ 16 января 2012

Как я могу набрать форму (например, прямоугольник с закругленными углами) в компонент?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Приведение - это просто изменение ссылки объекта на другое представление, а не преобразование объекта в объект другого типа.

Приведя пример с некоторыми составными классами, вы можете привести 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 в своем конструктор. Вот пример Я нашел для создания пользовательской кнопки Компонент круглой формы, который с некоторыми изменениями должен отвечать вашим потребностям.

Вы в основном ответили на свой вопрос по большей части в своем последнем комментарии, надеюсь, это поможет вам понять, как:).

Ура, надеюсь, это помогло.

0 голосов
/ 27 октября 2012

Из вашего дальнейшего отзыва я понимаю, что вы просто хотите создать пользовательский компонент.

Теперь сложный вопрос: вы действительно хотите / нуждаетесь в пользовательском компоненте?

Обычно вам нужно только расширить класс shape и реализовать / переопределить методы contains () (, другие необходимые вам методы) и paint (), где вы рисуете то, что хотите.

Затем слушатель может быть установлен в классе контейнера (JFame, JPanel, ..), который вы используете для размещения фигуры, и с помощью shape.contains (точка) вы можете обрабатывать события в нем.

Если вам действительно нужен компонент, основное преимущество заключается в том, что он может обрабатывать события, взаимодействовать с другими компонентами, а также с менеджерами макетов.

Вы можете проверить этот пример на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...