2012-03-30 2 views
2

내가 선택한 노드의 실제 선택 영역이 JTree의 맨 왼쪽부터 JTree의 맨 오른쪽까지 확장되도록 JTree를 수정하려고합니다. .JTree : L & F에 관계없이 모양 수정

웹상의 대부분의 예제에서는 BasicTreeUI를 확장하는 방법에 대해 설명합니다. 거기에서 선택 영역을 결정하는 메소드를 수정하면됩니다. 그러나 JTree는 실행 플랫폼에 관계없이 JTree가 해당 구현을 사용할 것을 요구합니다. 필자는 항상 Metal, Windows 또는 Aquia 구현이 아닌 BasicTreeUI를 사용할 때 특정 플랫폼을 대상으로하는 다양한 UI 구현을 활용할 수는 없습니다.

JTree에 현재 설치되어있는 BasicTreeUI의 모든 구현을 가져 와서 BasicTreeUI를 확장하는 사용자 정의 래퍼로 포장하는 것이 가장 이상적입니다. 거기에서 모든 메소드를 오버라이드하고 래핑 된 UI에 위임하고 노드 선택 영역을 다시 계산해야하는 경우 몇 가지 메소드를 구현합니다. 그러나 BasicTreeUI의 대부분의 메서드는 보호되어 있으므로 그래서이 작업을 실제로 수행 할 수 있습니다.

이 문제를 해결하는 방법을 모르는 ... 어떤 아이디어라도 환영합니다!

+0

"BasicTreeUI의 대부분의 메소드는 보호되어 있습니다"- 보호 된 경우 재정의 할 수 있습니다. 즉 'private'입니까? –

답변

2

아마 당신은 setUI를 오버라이드 (override)과 같이, 사용자 정의 트리 UI에서 제공하는 UI를 래핑 수 :

@Override 
public void setUI(TreeUI ui) { 
    super.setUI(new MyCustomTreeUI(ui)); 
} 

또 다른 옵션을/제공하는 글로벌 UIManager에 나무 UI 속성을 설정으로 찾고 고려. 플랫폼 별 트리 UI가 세계 UIManager에 속성 값을 요청하고 그에 따라 스스로를 구성 할 것이라고 생각합니다. 아마도 UIManager.put("Tree.selectionWidth", 100)과 같은 것을 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 그러나 MyCustomTreeUI는 제공된 UI 인스턴스의 필수 메서드를 재정의 할 수 없으므로 실제로 작동하지 않습니다. 특히, 노드 크기를 결정하는 BasicTreeUI # createNodeDimensions() 메서드의 치수를 수정하려고합니다. – sbrattla

+0

'protected' 메소드를 오버라이드 할 수 있습니다. –

+0

클래스가있는 패키지에 아무 것도 추가 할 수없는 경우 어떻게 보호 된 메서드를 재정의 하시겠습니까? – sbrattla