2009-06-28 5 views
2

Java JTree 패널을 구현 중입니다. 이 패널은 treelike (컴포지트 목록 - 다른 클래스 목록)의 집합에서 TreeModel 빌드를 보유합니다. 내가 정의한 인터페이스 세트를 기반으로 외부 항아리 구현에서 이러한 데이터 구조를 얻습니다.노드 객체의 상태가 변경 될 때 동적으로 JTree 뷰를 변경하는 방법은 무엇입니까?

트리 노드에는 체크 된 노드와 모든 자식 노드가 "활성화"되어야한다는 체크 박스가 있습니다. 즉, 노드가 나타내는 객체는 데이터를 가져 오는 것과 같이 뭔가를해야합니다 데이터베이스.

트리 노트는 "활성화"하지 않고, 즉 확인란을 선택하지 않고 선택할 수도 있습니다.

그 외에도 프로그램의 다른 부분이 데이터 모델 객체의 활성화 상태를 전환 할 수 있습니다. 따라서 treemodel이 작성하는 데이터 모델이 활성화 상태의 소스입니다. 이것은 동적으로 (un) 체크 박스를 체크함으로써 treeview에 반영되어야합니다.

이제 어떻게 구현할 수 있습니까? 누가 변화해야하는지 청취자가되어야합니까?

이제 노드에있는 모든 클래스가 활성화 필드를 포함하는 추상 클래스에서 확장됩니다. 이것이 진정한 데이터 소스입니다. 이 필드가 변경되면 가입 된 모든 리스너 (EventListener)에 통지해야합니다. 여기에는 확인란이 포함됩니다.

기본 TreeSelectionModel을 기반으로하지만 자식/부모를 검사해야하는지 확인하는 기능이 확장 된 TreeSelectionModel도 있습니다.

제 질문은 아마도 분명하지는 않지만이 복잡한 코드도 마찬가지입니다. 당신이 도울 수 있기를 바랍니다.

답변

2

움직이는 부분이 많은 것 같습니다. TreeModel을 통해 모든 변경 사항을 유입시키고 JTree을 자동으로 수령하면 좋을 것입니다. TreeModelDefaultTreeModel의 하위 클래스 인 경우 fire* (fireTableStructureChanged, fireTreeNodesChanged 등) 메소드를 사용하면 JTree에 다시 칠할 것을 경고합니다. AWT EventQueue에서이 이벤트 발생을 확인하십시오.

here is a good tutorialTree을 사용하는 예의로드가 있습니다.

1

jide 구성 요소를 확인하십시오. 그것은 또한 checkboxtree을 포함한다 : 당신이 바로 그 아이디어를 가지고있는 것처럼

alt text

1

그것은 나에게 소리 - 노드은 "활성화"지식 정규 소스 및 활성화 이벤트의 표준 소스 만들기를. 그런 다음 TreeModel을 청취하고 해당 이벤트를 fireTreeNodesChanged() 등으로 변환하면 JTree이 자동으로 업데이트됩니다.

스스로 문제를 해결하려면 노드 -> 트리 이벤트 관계를 일방적으로 유지하십시오. 즉, 트리를 컨트롤러로 사용하지 마십시오. 트리 이벤트가 활성화 상태를 변경하지 못하게하십시오.