2011-11-02 1 views
2

JSlider 위젯과 비슷한 새로운 위젯을 만드는 데 관심이 있지만, 이전의 슬라이더 위치를 표시하는 "고스트"(반투명) 노브가 있습니다 실제 노브의 움직임에 트레일과 같은 애니메이션을 추가합니다.자바 스윙 위젯 확장하기 (JSlider에 애니메이션과 여분의 마커를 추가하고 싶습니다.)

새로운 기능을 추가하기 위해 Java Swing 위젯을 확장하는 올바른 방법에 다소 혼란 스럽습니다.

1), JSlider에 확장 여기에 내 모든 새로운 모델 정보를 배치, 먼저 JSlider에 그리는 페인트를 덮어하고,보다 내 원하는 추가 오버레이 : 제가보기에는

나는 몇 가지 옵션이 있습니다. 이 솔루션의 문제점은 모든 상황에서 작동하지 않을 수있는 완전한 기하학적 정보에 액세스 할 수 없으므로 올바른 위치에 마크를 얻으려면 시행 착오를 사용해야한다는 것입니다.

2) Slider 위젯 (JSlider, SliderUI, BasicSliderUI, MetalSliderUI, BoundedRangeModel, DefaultBoundedRangeModel)의 다양한 클래스를 확장합니다. 여기에서 볼 수있는 장점은 적절한 모델 - 뷰 - 컨트롤러 아키텍처를 유지하는 것입니다. 그러나이 작업에는 클래스 내의 다양한 함수가 오버로드되어야합니다. 나는 그 결과가 매우 해킹 된 것처럼 보일 것이라고 생각한다.

3) Slider 위젯의 코드를 모두 복사하고 수정하여 새 위젯을 만듭니다. 이것은 옵션 (2)와 유사하지만 코드를 수정 한 다음 기능을 확장하는 것이 더 간단 할 수 있습니다 (기본적으로 복사/수정 코드 일 것입니다).

4) 원하는 기능으로 처음부터 슬라이더 위젯을 다시 만듭니다. 기존 Swing Slider 위젯의 코드를 살펴본 후에 이것은 간단한 작업이 아닙니다.

기존의 기능을 빌려주는 새로운 위젯을 만드는 좀 더 우아한 방법이 없습니다.

통찰력을 가져 주셔서 감사합니다.

답변

2

2) 약간의 변경이 있습니다. 모든 메서드 호출을 위임 UI에 위임하는 WrapperSliderUI 클래스를 만듭니다. 그리고 페인트 방법을 오버라이드하십시오. 당신의 JSlider에의

의 setUI는 원래 UI 클래스를 확인하고 그에 따라 그림을 적응 페인트에 WrapperSliderUI

public void setUI(SliderUI ui) { 
    super.setUI(new WrapperSliderUI(ui)); 
} 

에 원래의 UI를 마무리해야한다.

+0

+1 관련 사례 [here] (http://stackoverflow.com/questions/6996263)가 있습니다. – trashgod

+0

감사합니다. 이것이 도움이되었습니다. – kashiko

관련 문제