ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA/SWT] Table Header 클릭으로 Table 정렬하는 방법
    JAVA/SWT 2021. 6. 4. 11:47
    728x90
    728x90

    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);
    }

     

    728x90
    728x90
Designed by Tistory.