2009-06-04 4 views
2

특정 화면 위치에 그림을 그리는 GUI 요소를 사용해야합니다. 사용자가이 그림을 선택하면 그림 주위에 테두리가 그려집니다. 이제 사용자에게 특정 값의 그림을 식별하는 테두리를 추가하고자합니다.GUI 요소의 도면 분할하기

요소가 선택되면 자신의 내부 상태를보고 요소를 그리는 방법을 결정합니다.

graphic.drawImage(icon, x, y, null); 
if (selected) { 
    drawBorder(); 
} 

이 드로잉 방법에 다른 것을 추가 할 생각이 없습니다. 요소의 동작을 상속하고 draw 메서드를 덮어 쓰는 새 클래스를 만들려고했지만 모든 상속 된 클래스에서 선택한 코드 전체를 복제한다는 의미입니다. 하위 클래스를 만들지 않고이 문제를 해결할 수 있습니까?

답변

1

디자인 패턴으로 태그를 지정 했으므로 패턴 지향적 인 접근 방식을 찾고있는 것처럼 보였으므로 state pattern을 살펴 보시기 바랍니다. 위키 백과 페이지의 예제는 심지어 GUI를 그리는 동안 상태를 유지한다고 언급합니다. 불행히도, 이것은 하위 클래스와 재정의 된 메소드로 다른 클래스를 만들어야한다는 것을 의미합니다.

변경 될 가능성이 있습니까? 나는. 드로잉에 새로운 비헤이비어를 추가한다고 현실적으로 생각하십니까 (예 : 사용자가 두 번 클릭하거나 다른 유형의 경계를 그리고 사용자가 마우스 오른쪽 버튼을 클릭하거나 테두리의 색상을 변경 한 경우)? 더 많은 행동이 추가되는 것을 본다면 앞으로 나아갈 것이며 더 많은 OO 접근 방식을 취하는 것이 현명하다고 생각합니다. 이 두 가지 경우에만, 난 그냥 else if 성명을 추가 말하고 싶지만.

+0

나는 당신이 옳다고 생각합니다. 두 개 또는 세 개의 다른 동작에 대해서만 서브 클래 싱을 수행하는 것은 오버 헤드이며, 나중에 변경하면 더 고급 접근 방식으로 변경할 수 있습니다. 지금은 if else를 스위치로 바꾸고 열거 형으로 선택된 부울을 선택하여 드로잉에 어떤 동작을 사용해야 하는지를 알려줍니다. – Janusz

+0

꽤 현명한 아이디어처럼 들립니다. 관리하기가 너무 어려워지면 switch 문을 쉽게 리팩토링하여 고급 OO 접근 방식을 사용할 수 있습니다. –

0

if-else에 대해 당신은 무엇을 가지고 있습니까?

선택한 항목에 대해 완전히 새로운 개체를 만드는 것이 그리기 기능에서 플래그를 확인하는 것보다 덜 이해합니다.

0

하나의 가능성은 drawBorder() 메소드는 매개 변수를 할 수 있도록하는 것입니다 :

private void drawBorder(boolean isSelected, boolean hasSpecialValue); 

이 방법을 그릴 수있는 국경의 종류를 확인할 수 있습니다.