JFace Simple Tree Example

JFace Simple Tree Example



JFace에서 사용되는 Tree 역시 SWT와 기본 근간은 다르지 않다. 대신 JFace에서 Tree를 사용한다는 말의 의미는 TreeViewer를 이용한 ViewerFramework를 사용한다는 점이다. 그에 따라 LabelProvider, ContentProvider를 적용할 수 있다는 점이 가장 큰 특징이다.



[MyModel Class]

기본 준비 작업으로 간단한 VO객체를 준비한다. 대신, 반드시 VO객체는 부모 노드와 자식노드의 배열을 가지고 있어야 한다.

createModel은 VO객체 Dummy Data를 생성하는 역할만 한다. 추후 main에서 호출되고 종료한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//VO 클래스
public class MyModel {
        
    public MyModel parent; // 부모노드
        
    public List<MyModel> child = new ArrayList<>(); // 자식노드
        
    public int counter;
 
    public MyModel(int counter, MyModel parent) {
        this.parent = parent;
        this.counter = counter;
    }
 
    @Override
    public String toString() {
        String name = "Item ";
        if( parent != null ) {
            name = parent.toString() + ".";
        }
 
        name += counter;
 
        return name;
    }
 
}
 
// VO MODEL의 DUMMY 데이터 생성
private MyModel createModel() {
 
    MyModel root = new MyModel(0,null);
    root.counter = 0;
 
    MyModel tmp;
    forint i = 1; i < 10; i++ ) {
        tmp = new MyModel(i, root);
        root.child.add(tmp);
        forint j = 1; j < i; j++ ) {
            tmp.child.add(new MyModel(j,tmp));
        }
    }
 
    return root;
 
}
cs



[ITreeContentProvider Class]

Viewer에 사용될 ContentProvider를 정의한다. ITreeContentProvider를 구현하여 아래 상황에 맞게 적절히 부모노드와 자식노드를 리턴하여 주면된다.

주된 역할은 실제 Tree에서 보여질 노드를 리턴하는 일이다. (부모자식 관계가 포인트)

inputChanged는 Viwer의 Input이 변경될 때 호출되고, 나머지 getElements, getChildren, getParent등 은 Tree가 화면에 표현될 때 Viwer에서 각각 필요한 메소드를 자동으로 호출한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
private class MyContentProvider implements ITreeContentProvider {
 
        // inputElement 노드의 하위 노드가 존재하는 경우 자식노드 배열을 리턴한다.
        @Override
        public Object[] getElements(Object inputElement) {
            return ((MyModel)inputElement).child.toArray();
        }
        
        // parentElement 노드의 하위 노드가 존재하는 경우 자식노드 배열을 리턴한다.
        @Override
        public Object[] getChildren(Object parentElement) {
            return getElements(parentElement);
        }
 
        // 현재 노드의 부모노드가 존재하는 경우 부모노드를 리턴한다.
        // 부모노드가 null인 경우 Tree에서 최상위 노드가 된다.
        @Override
        public Object getParent(Object element) {
            if( element == nullreturn null;
            return ((MyModel)element).parent;
        }
 
        // 자식 노드가 실제로 존재하지 검증 시 사용된다.
        @Override
        public boolean hasChildren(Object element) {
            return ((MyModel)element).child.size() > 0;
        }
 
        // Viwer가 dispose될 때 호출
        @Override
        public void dispose() {
 
        }
 
        // Viwer에서 input이 다른 객체로 변경되었을 경우 호출된다.
        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 
        }
 
 
}
cs



[LabelProvider Class]

화면에 보여줄 Tree각 노드의 이름을 리턴한다. 

Viwer에서 별다른 LabelProvider가 세팅되지 않은 경우 기본 LabelProvider가 동작하여 Model의 toString()값으로 노드를 구성하여 준다.

노드 명칭을 조작하고 싶은 경우 getText()에서 리턴 String을 조작하면 되고, Image가 필요한 경우 getImage()를 Override하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyTreeLabelProvider extends LabelProvider {
        // 노드에 표시될 이름을 리턴한다.
        // 별도로 구현하지 않는 경우 element.toString()으로 화면에 표시된다.
        @Override
        public String getText(Object element) {
            return super.getText(element);
        }
        
        // 노드에 표시될 이미지를 리턴한다.
        @Override
        public Image getImage(Object element) {
            return super.getImage(element);
        }
}
cs



[Main TreeViwer 생성]

위에 생성된 레이블프로바이더, 컨텐츠프로바이더를 기반으로 TreeViwer를 생성하여 주면 된다.

1
2
3
4
TreeViewer v = new TreeViewer(shell);
v.setLabelProvider(new MyTreeLabelProvider());  // 레이블 프로바이더 세팅
v.setContentProvider(new MyContentProvider());  // 컨텐츠 프로바이더 세팅
v.setInput(createModel()); // 모델 세팅
cs



[수행결과]



다운로드

JFaceTreeExample.zip



트리뷰어 : http://wiki.eclipse.org/JFaceSnippets

  테이블 트리 뷰어 : http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesTableTreeTableTree.htm

이 글을 공유하기

댓글

Email by JB FACTORY