2012-01-16 3 views

답변

1

캐스팅은 단순히 객체의 참조를 다른 표현으로 변경하고 다른 유형의 객체로 변환하거나 객체를 변경하지 않습니다. 그 모양은 이미 실제로 광장입니다 IFF에 몇 가지 만들어 클래스와 예를주기

, 당신은 광장에 형태 캐스트 할 수 있습니다

이 단지와 관련된 개체의 기존 여분의 동작을 노출됩니다
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 클래스에서 지원되지 않으므로 캐스트를 수행하여 구성 요소와 관련된 동작 (예 : 리스너 추가)을 노출 할 수 없습니다. 셰이프 클래스는 리스너를 추가하는 것이 합리적이라 할지라도 인터페이스에서 이벤트 메시지를받지 못합니다. 리스너를 인터페이스에 Component로 추가하지 않았기 때문입니다. 아마도 수동으로 구성 요소에 도형을 페인팅하고 있으므로 구성 요소 계층 구조의 일부가 아닌 것으로 이미 이해해야합니다.

당신이 제안한 것처럼,이 문제를 해결할 수있는 가장 좋은 방법은 구성 요소 안에 도형이 그려지는 지점에 이미 도달했기 때문입니다. 관련 MouseEvent의 x 및 y 좌표가 각각 내부에 있는지 모양.

처음부터 구성 요소로 처리하려는 경우 나머지 셰이더를 만드는 것과 같은 방법으로 각 셰이프에 대한 구성 요소를 만들어서 LayoutManager를 사용하여 컨테이너에 추가해야합니다. 이것은 당신이 말한 것처럼 "커스텀 컴포넌트"를 생성하는 것입니다.이 클래스는 사용 가능한 클래스 나 메소드가 아닌, 자신의 하위 클래스 인 Component를 생성하는 것입니다.이 클래스는 아마도 Shape 인수를 가질 수 있습니다. 건설자. Here is an example 커스텀 버튼 컴포넌트를 생성 한 것을 발견했습니다.이 컴포넌트는 필요에 맞게 수정해야합니다.

기본적으로 마지막 질문에 대한 대부분의 질문에 귀하가 답변했으며, 다음과 같이 이해하는 데 도움이됩니다. :)

환호, 이것이 도움이되기를 바랍니다.

0

추가 피드백에서 나는 사용자 지정 구성 요소를 만들고 싶다는 것을 이해합니다.

이제 까다로운 질문입니다. 사용자 지정 구성 요소가 실제로 필요합니까/필요합니까?

일반적으로 모양 클래스를 확장하고 contains() (및 필요한 다른 메서드) 및 paint() 메서드를 구현/재정의하면됩니다.

그러면 리스너를 셰이프 배치에 사용하는 컨테이너 클래스 (JFame, JPanel, ..) 내에 설정하고 shape.contains (point)를 사용하여 이벤트를 처리 할 수 ​​있습니다.

구성 요소가 정말로 필요한 경우 주요 이점은 이벤트를 처리하고 다른 구성 요소와 상호 작용할 수 있으며 레이아웃 관리자와 상호 작용할 수 있다는 것입니다.

this 예를 확인할 수 있습니다.

관련 문제