2010-07-08 1 views
1

저는 JTree와 TreeCellRenderer에 대해 조사했습니다. 일반적으로, 어플리케이션 (1 개의 JTree를 가지는)은 TreeCellRenderer의 1 개의 인스턴스만을가집니다. 어플리케이션은, TreeCellRenderer의 getTreeCellRendererComponent 메소드를 복수 호출 해, 각 TreeCell의 묘화 방법을 결정합니다. 그러한 호출은, 셀이 선택, 선택 해제, 이동, 스크롤 등의 많은 경우에 행해집니다. 왜 그들은 각각 하나의 셀을 담당하는 TreeCellRenderer의 여러 인스턴스를 갖는 대신에 그렇게하기로 결정 했습니까 ??TreeCellRenderer 용 디자인

각 셀에 확인란이있는 JTree를 만들려고합니다. 확인란은 사용자가 선택/선택을 취소 할 수 있습니다. 그런 다음 TreeNode userObject의 값은이 체크 박스의 상태에 따라 설정됩니다. 그러나 현재의 JTree 디자인에서는 JCheckBox의 인스턴스가 하나뿐이기 때문에 셀을 어떻게 보이는지 (실제로는 확인할 수 없음) 표시하는 데에만 사용되므로 불가능합니다. 어떤면에서는 TreeCell과 상자 검사를 분리하고 싶습니다.

몇 가지 해결 방법이 있습니다 (MouseAdapter 구현 및 체크 상자가 렌더링 된 곳에서 마우스 클릭이 가까운 지 확인한 다음 TreeCellRenderer의 모양을 변경하여 체크 상자를 에뮬레이트 함). 그러나 이것이 가능한지 알고 싶습니다. 좀 더 직접적으로 할 수 있습니다. 감사!

답변

2

왜 그들은 각각 하나의 셀을 담당하는 TreeCellRenderer의 인스턴스가 여러 개가 아니라 그 작업을 결정 했습니까?

이것은 flyweight pattern의 좋은 예입니다.

체크 박스 트리의 경우 org.netbeans.swing.outline.Outline, here을 언급했지만 다른 examples을 사용할 수 있습니다.

부록은 : 더 밀접하게 질문을 읽고, 당신은 질문 :

나는 TreeCell의 선택과 박스의 체크를 분리하려는 어떤 의미에서. 데이터 (체크인 또는 체크)가 모델 (TreeModel)에 저장되어야 아니라보기 (JCheckBox)

이는 올바른 본능이다. example은 그에 따라 (암시 적) 모델에서 CheckBoxNode의 인스턴스를 사용합니다.

+0

이전에 그 예를 공부했습니다. 그것은 내가 원하는 것만은 아닙니다 : 노드가 선택 될 때마다 상자를 체크하지만, 마우스가 체크 박스를 클릭 할 때만 체크하고, 마우스가 셀을 클릭 할 때마다 체크하지 않습니다. 그런데이 예제에는 버그가 있습니다. mouseClicked 메서드에서 실제로는 tree.revalidate()를 호출해야합니다. 그렇지 않으면 행이 0이 아니어도됩니다. 그렇지 않으면 일부 하위 셀은 DIG_IN 모드에서 업데이트되지 않습니다. 개요 개체를 살펴 보겠습니다. 감사. – Raymond

+0

@ 레이몬드 : 오신 것을 환영합니다. – trashgod

+0

음 ... netbeans 패키지가 표준 자바의 일부가 아닌 것 같습니다. 사실입니까? 만약 내 프로그램이 이들을 사용한다면, 코드를 사용하는 사람들은 netbeans를 너무 설치해야 할 것입니다. – Raymond

관련 문제