JFace TableViewer Example
- 프로그래밍/SWT & JFace
- 2016. 3. 20. 01:09
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(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); /* * 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(); } }); |
결과화면
'프로그래밍 > SWT & JFace' 카테고리의 다른 글
SWT Table Example (0) | 2016.03.13 |
---|---|
JFace Simple Tree Example (0) | 2016.02.29 |
SWT Simple Tree Example (0) | 2016.02.21 |
SWT/JFace Layout (0) | 2016.02.15 |
JFace Event처리 (Action and Contribution) (0) | 2016.02.12 |
SWT Event 처리 (Event and Listener) (0) | 2016.02.11 |
TabFolder를 이용하여 탭화면 구성하기 (0) | 2016.02.10 |
화면에 표시되는 주요 클래스 구조 Widget/Control/Composite (0) | 2016.01.17 |
이 글을 공유하기