JFace TableViewer Example

JFace TableViewer Example

SWT 에서는 Table 객체를 직접 컨트롤 하지만, JFace에서는 TableViwer를 컨트롤 하고 Model과 결합할 수 잇는 Provider를 제공하는 방식으로 Table을 컨트롤 한다. 전체 소스보다는 부분부분의 소스를 올리면서 설명하는게 이해하기 쉬울듯 하다.


Table에 사용 될 VO Class 정의 및 기초데이터 생성

Grade는 inner Class로 생성

priavate 변수로 gradeArr, tableViewer, COLUMN_HEADER를 미리 정의

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
     * 데이터를 담을 List
     */
    private List<Grade> gradeArr;
    
    /**
     * 테이블 Viwer
     */
    private TableViewer tableViewer ;
    
    /**
     * Header 정보를 담는 String 배열
     */
    private String[] COLUMN_HEADER = new String[]{"이름","나이","국어","수학","사회","과학"};
 
 
    /**
     * List에 담겨질 Vo
     * @author leejisoo
     *
     */
    private class Grade {
        
        String name;    // 이름
        String age;        // 나이
        String lang;    // 국어성적
        String math;    // 수학성적
        String social;    // 사회성적
        String science;    // 과학성적
        
        /**
         * 생성자
         * @param name
         * @param age
         * @param lang
         * @param math
         * @param social
         * @param science
         */
        public Grade(String name, String age, String lang, String math,
                String social, String science) {
            super();
            this.name = name;
            this.age = age;
            this.lang = lang;
            this.math = math;
            this.social = social;
            this.science = science;
        }
        /*
         * Getter and Setter
         */
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getLang() {
            return lang;
        }
        public void setLang(String lang) {
            this.lang = lang;
        }
        public String getMath() {
            return math;
        }
        public void setMath(String math) {
            this.math = math;
        }
        public String getSocial() {
            return social;
        }
        public void setSocial(String social) {
            this.social = social;
        }
        public String getScience() {
            return science;
        }
        public void setScience(String science) {
            this.science = science;
        }
    }
    
    /**
     * 초기데이터 생성
     */
    public void makeData() {
        if(gradeArr == null) {
            gradeArr = new ArrayList<Grade>();
            gradeArr.add(new Grade("이지수""31""A+""A+""A+""A+"));
            gradeArr.add(new Grade("이지연""29""B+""A+""F""F"));
            gradeArr.add(new Grade("최영학""31""A+""B+""A+""B+"));
        }
    }
cs



TableViwer 생성 및 기초설정

TableViewer.getTable()을 통해서 자동 생성 된 Table에 접근 할 수 있다.

혹은 TableViwer생성시 미리 생성 해 놓은 Table을 생성자 인자에 넣어 등록하는 방법도 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        /*
         * TableLayout 생성
         */
        TableLayout layout = new TableLayout();
        layout.addColumnData(new ColumnWeightData(33true));
        layout.addColumnData(new ColumnWeightData(33true));
        layout.addColumnData(new ColumnWeightData(33true));
        layout.addColumnData(new ColumnWeightData(33true));
        layout.addColumnData(new ColumnWeightData(33true));
        
 
        /*
         * TableViewer 생성 및 각종 기본 설정
         */
        tableViewer = new TableViewer(container, SWT.BORDER|SWT.FULL_SELECTION);
        tableViewer.getTable().setLayout(layout);
        tableViewer.setUseHashlookup(true);    // table 렌더링 속도 향상
        tableViewer.getTable().setLinesVisible(true);
        tableViewer.getTable().setHeaderVisible(true);
cs



TableViwer ContentProvider

IStructuredContentProvider를 구현하였다.

getElementes(Object input)에서 테이이블 전체를 표현하는 Object[]를 리턴해주어야 한다.

input은 추후에 tableViwer.setInput(object)로 세팅해 줄 Object 인데, object에 String으로 sql 문장을 넣어 주고 실제 getElements에서 조회하여 결과를 리턴하는 방식으로도 구현이 가능하니 참고하도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        /*
         * ContentProvider 지정
         */
        tableViewer.setContentProvider(new IStructuredContentProvider() {
            @Override
            public void inputChanged(Viewer viewer, Object arg1, Object arg2) {}
            @Override
            public void dispose() {}
            /**
             * Object배열을 리턴한다.
             *  - 이 때, 리턴되는 Object배열은 전체 테이블 데이터를 포함하는 배열
             */
            @Override
            public Object[] getElements(Object input) {
                return ((ArrayList<Grade>)input).toArray();
            }
        });
cs



TableViwer LableProvider

가장 중요한 Provider 중에 하나로 실제 화면에 보여지게 되는 내용을 getColumnText에서 리턴하여 준다.

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
        /*
         * LabelProvider 지정
         */
        tableViewer.setLabelProvider(new  ITableLabelProvider() {
            @Override
            public void addListener(ILabelProviderListener arg0) {}
            @Override
            public void removeListener(ILabelProviderListener arg0) {}
            @Override
            public void dispose() {}
            @Override
            public boolean isLabelProperty(Object arg0, String arg1) {
                return false;
            }
            
            /*
             * 각 컬럼 idx 별 리턴되는 String 을 리턴한다.
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
             */
            @Override
            public String getColumnText(Object element, int idx) {
                Grade grade = (Grade)element;
                switch (idx) {
                case 0:
                    return grade.getName();
                case 1:
                    return grade.getAge();
                case 2:
                    return grade.getLang();
                case 3:
                    return grade.getMath();
                case 4:
                    return grade.getSocial();
                case 5:
                    return grade.getScience();
                }
                return "";
            }
            
            @Override
            public Image getColumnImage(Object arg0, int arg1) {
                return null;
            }
        });
cs



여기까지만 작업하고 tableViwer.setInput(gradeArr)을 수행하여도 테이블을 보여진다. 추가적으로 테이블을 편집 가능하게 하려면 아래 작업을 구현하도록 하자.


TableViwer Modify 기능제공 

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
         * Cell Modify 기능추가
         */
        // Column Properties 지정 : ICellModifier 동작시 필수
        tableViewer.setColumnProperties(COLUMN_HEADER);
        
        // CellEditor 생성 
        CellEditor[] CELL_EDITORS = new CellEditor[COLUMN_HEADER.length];
        for(int i=0; i < CELL_EDITORS.length ; i++) {
            CELL_EDITORS[i] = new TextCellEditor(tableViewer.getTable());
            // or CheckboxCellEditor, ComboBoxCellEditor 등 사용
        }        
        tableViewer.setCellEditors(CELL_EDITORS);
        
        // Modifier 지정
        tableViewer.setCellModifier(new ICellModifier() {
            
            /**
             * 각 Cell 별 수정가능 여부를 판단하여 반환 (false인 경우 수정 불가)
             * @Param Object 각 열을 표현하는 model
             * @Param String tableviewer.setColumnProperties로 지정된 Header String
             */
            @Override
            public boolean canModify(Object arg0, String arg1) {
                Grade model = (Grade)arg0; // 각 열을 표현하는 model 저보
                System.out.println(model);
                
                // 이름은 수정 불가
                if(arg1.equals(COLUMN_HEADER[0])) {
                    return false;
                }
                // 나머지는 수정 가능 하도록 
                else {
                    return true;
                }
            }
            
            /**
             * 편집 할 프로퍼티의 현재 값을 리턴 
             * ICellModifier 내부적으로 modify()를 호출하기 전 값을 넘겨주는 역할을 한다.
             */
            @Override
            public Object getValue(Object arg0, String arg1) {
                Grade model = (Grade)arg0;
                if(arg1.equals(COLUMN_HEADER[0])) {
                    return model.getName();
                }
                else if (arg1.equals(COLUMN_HEADER[1])) {
                    return model.getAge();
                }
                else if (arg1.equals(COLUMN_HEADER[2])) {
                    return model.getLang();
                }
                else if (arg1.equals(COLUMN_HEADER[3])) {
                    return model.getMath();
                }
                else if (arg1.equals(COLUMN_HEADER[4])) {
                    return model.getSocial();
                }
                else if (arg1.equals(COLUMN_HEADER[5])) {
                    return model.getScience();
                }
                return null;
            }
            
            /**
             * model 을 획득하여 변경 데이터를 반영하고 테이블 refresh()
             */
            @Override
            public void modify(Object arg0, String arg1, Object arg2) {
                System.out.println(arg0);
                TableItem talbeitem = (TableItem)arg0;    // tableitem
                String columName = arg1;                // 컬럼이름
                String value = (String)arg2;            // 현재 값
                
                Grade model = (Grade)talbeitem.getData();
                
                if(columName.equals(COLUMN_HEADER[0])) {
                    model.setName(value);
                }
                else if (columName.equals(COLUMN_HEADER[1])) {
                    model.setAge(value);
                }
                else if (columName.equals(COLUMN_HEADER[2])) {
                    model.setLang(value);
                }
                else if (columName.equals(COLUMN_HEADER[3])) {
                    model.setMath(value);
                }
                else if (columName.equals(COLUMN_HEADER[4])) {
                    model.setSocial(value);
                }
                else if (columName.equals(COLUMN_HEADER[5])) {
                    model.setScience(value);
                }
                
                tableViewer.refresh();
            }
        });

cs


결과화면



TableExample JFace.zip



이 글을 공유하기

댓글

Email by JB FACTORY