-
[JAVA/SWT] Table Header 클릭으로 Table 정렬하는 방법JAVA/SWT 2021. 6. 4. 11:47728x90
SWT Table 생성 시 데이터의 정렬을 하는 방법을 알아보자
1. Table 을 가지고 있는 Class 에 SelectionListener 를 인터페이스를 구현하고 method overriding 을 한다
@Override public void widgetDefaultSelected(SelectionEvent arg0) { // TODO Auto-generated method stub } @Override public void widgetSelected(SelectionEvent event) { // TODO Auto-generated method stub }
2. HeadColumn 인 TableColumn에 listener 를 add 한다
ex) TableColumn 이 columnModel, columnLine, columnProcess 가 있다면 아래와 같이 listener 를 넣어준다
columnModel.addSelectionListener(this); columnLine.addSelectionListener(this); columnProcess.addSelectionListener(this);
3. 이제 HeadColumn 을 선택했을 때 1번에서 Overriding widgetSelected 함수가 동작하게된다
Selection Event 가 발생했을 때 선택한것이 TableColumn 일 때만 동작해야하므로 instanceof 를 사용해준다
TableColumn 을 선택했을 경우 데이터를 sorting 하는 sortTableColumn() 이란 함수를 동작시킬 것이다
@Override public void widgetDefaultSelected(SelectionEvent arg0) { // TODO Auto-generated method stub } @Override public void widgetSelected(SelectionEvent event) { if(event.getSource() instanceof TableColumn) { sortTableComlumn((TableColumn) event.widget); } }
4. sortTableColumn() 함수를 생성하기 전에 데이터를 정의하는 클래스에 Comparator 인터페이스를 구현해야한다
ex) 데이터 클래스(ManufactureData)가 model, line, process 라는 변수를 가지고 있다면 아래와 같이 구현하면된다
public class ManufactureDataComparator implements Comparator<ManufactureData> { public boolean isColumnChanged = false; private int direction; private TableColumn column = null; @Override public int compare(ManufactureData o1, ManufactureData o2) { int rc = 0; switch (column.getText()) { case "Model": rc = (o1.model + "").compareTo((o2.model + "")); break; case "Line" : rc = (o1.line + "").compareTo((o2.line + "")); break; case "Process" : rc = (o1.process + "").compareTo((o2.process + "")); break; } if(direction == SWT.DOWN) { rc = -rc; } return rc; } public void setColumn(TableColumn column) { if(this.column != column) { isColumnChanged = true; direction = SWT.UP; } else { isColumnChanged = false; } this.column = column; } public void reverseDirection() { this.direction = direction == SWT.UP ? SWT.DOWN : SWT.UP; } public int getDirection() { return this.direction; } }
5. Comparator 클래스를 선언하고 sortTableColumn() 함수를 구현한다
TableColumn 을 선택하게 되면 comparator 에 Tablecolumn 이 저장되게 되고
같은 Tablecolumn 을 선택하게 되면 reverseDirection() 함수로 인해 direction 이 변경된다
그리고 Collections.sort() 함수에 넣을 데이터(list) 와 comparator 를 넣어주면 list 는 정렬이 된다
마지막으로 정렬된 list 를 tableViewer 에 넣어주기만 하면 된다
private ManufactureDataComparator comparator = new ManufactureDataComparator(); private void sortTableComlumn(TableColumn column) { comparator.setColumn(column); if(!comparator.isColumnChanged) { comparator.reverseDirection(); } Table table = column.getParent(); if(list == null) return; Collections.sort(list, comparator); table.setSortColumn(column); table.setSortDirection(comparator.getDirection()); table.removeAll(); tableViewer.setInput(list); EsolControlLib.Table_AutoFit(tableViewer); }
728x90728x90'JAVA > SWT' 카테고리의 다른 글
[JAVA/SWT] 다른 Thread 에서 Cursor 모양 변경하는 방법 (0) 2021.06.03 Dialog 생성 시 기본으로 생기는 Ok, Cancel 버튼 사용 및 Custom (0) 2021.05.14 GridLayout 에서 가로로 꽉 차게 하는 법(horizontal fill) (0) 2020.10.12