2017-01-20 4 views
1

오름차순 및 내림차순 정렬 방법. 다음 SWT 코드에서 오름차순은 성공적으로 작동하지만 테이블 헤더를 클릭 할 때 내림차순으로 작동하지 않습니다.SWT 열 내림차순 정렬 방법

다음 코드는 다음과 같습니다.

package test; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.SimpleDateFormat; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Date; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Table; 
    import org.eclipse.swt.widgets.TableColumn; 
import org.eclipse.swt.widgets.TableItem; 

    public class SortTable { 
    private TableRow rows[] = new TableRow[] { 
      new TableRow(1, "aaa", new Date(1363784269000L), 0.000565529), 
      new TableRow(2, "abc", new Date(1367784269000L),1.09E-06), 
      new TableRow(3, "efc", new Date(1363584269000L),0.000273487), 
      new TableRow(4, "ccc", new Date(1363734269000L),0.000170431), 
      new TableRow(5, "ddd", new Date(1363734269000L),1.09E-06), 
      new TableRow(6, "fff", new Date(1363734269000L),0.000273487), 
      new TableRow(7, "ggg", new Date(1363734269000L),0.000170431), 

}; 
private Table table; 
private TableColumn intColumn; 
private TableColumn strColumn; 
private TableColumn dateColumn; 
private TableColumn scientificColumn; 

    public SortTable() { 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 
    table = new Table(shell, SWT.BORDER); 
    table.setHeaderVisible(true); 
    intColumn = new TableColumn(table, SWT.NONE); 
    intColumn.setText("int"); 
    intColumn.setWidth(50); 
    strColumn = new TableColumn(table, SWT.NONE); 
    strColumn.setText("string"); 
    strColumn.setWidth(50); 
    dateColumn = new TableColumn(table, SWT.NONE); 
    dateColumn.setText("date"); 
    dateColumn.setWidth(100); 

    scientificColumn = new TableColumn(table, SWT.NONE); 
    scientificColumn.setText("scientificvalue"); 
    scientificColumn.setWidth(100); 

    updateTable(); 

    Listener sortListener = new Listener() { 
     public void handleEvent(Event e) { 
      TableColumn column = (TableColumn) e.widget; 
      if (column == intColumn) Arrays.sort(rows, BY_VAL); 
      if (column == strColumn) Arrays.sort(rows, BY_STR); 
      if (column == dateColumn) Arrays.sort(rows, BY_DATE); 
      if (column == scientificColumn) Arrays.sort(rows,BY_VAL); 
      table.setSortColumn(column); 
      updateTable(); 
     } 
    }; 

    Listener reverseSortListener = new Listener() { 
     public void handleEvent(Event e) { 
      TableColumn column = (TableColumn) e.widget; 
      if (column == intColumn) Arrays.sort(rows, Collections.reverseOrder()); 
      if (column == strColumn) Arrays.sort(rows, Collections.reverseOrder()); 
      if (column == dateColumn) Arrays.sort(rows, Collections.reverseOrder()); 
      if (column == scientificColumn) Arrays.sort(rows,Collections.reverseOrder()); 
      table.setSortColumn(column); 
      updateTable(); 
     } 
    }; 
     //  intColumn.addListener(SWT.Selection, sortListener); 
     //  strColumn.addListener(SWT.Selection, sortListener); 
     //  dateColumn.addListener(SWT.Selection, sortListener); 
     //  scientificColumn.addListener(SWT.Selection, sortListener); 

    intColumn.addListener(SWT.Selection, reverseSortListener); 
    strColumn.addListener(SWT.Selection, reverseSortListener); 
    dateColumn.addListener(SWT.Selection, reverseSortListener); 
    scientificColumn.addListener(SWT.Selection, reverseSortListener); 

    shell.setSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, 300); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

private void updateTable() { 
    table.removeAll(); 
    for (TableRow row : rows) { 
     TableItem item = new TableItem(table, SWT.NONE); 
    //   item.setText(row.asString()); 
     item.setText(row.asDouble()); 
    } 
} 

public final Comparator<TableRow> BY_VAL = new Comparator<TableRow>() { 
    @Override 
    public int compare(TableRow o1, TableRow o2) { 
     if (o1.val < o2.val) return -1; 
     if (o1.val > o2.val) return 1; 
     return 0; 
    } 
}; 

public final Comparator<TableRow> BY_STR = new Comparator<TableRow>() { 
    @Override 
    public int compare(TableRow o1, TableRow o2) { 
     return o1.str.compareTo(o2.str); 
    } 
}; 

public final Comparator<TableRow> BY_DATE = new Comparator<TableRow>() { 
    @Override 
    public int compare(TableRow o1, TableRow o2) { 
     return o1.date.compareTo(o2.date); 
    } 
}; 


private class TableRow { 
    private int val; 
    private String str; 
    private Date date; 
    private double sciVal; 

    private SimpleDateFormat format = new SimpleDateFormat(); 
    //  private NumberFormat formatter = new DecimalFormat("###.#####"); 

    public TableRow(int val, String str, Date date, double sciVal) { 
     this.val = val; 
     this.str = str; 
     this.date = date; 
     this.sciVal = sciVal; 
    } 

    public String[] asString() { 
     return new String[] {Integer.toString(val), str, format.format(date)}; 
    } 
    public String[] asDouble() { 
     return new String[] {Integer.toString(val), str, format.format(date),String.format("%.3E", sciVal)}; 
    } 
} 

public static void main(String[] args) { 
    new SortTable(); 
} 

}

+0

jquery-ui-sortable가 여기에 태그로 사용되는 이유는 무엇입니까? 나는 어떤 js 코드를 볼 수 없다. –

답변

1

Collections.reverseOrder()자연 순서 배열 내용에 기초하여 역순으로 배열을 정렬하는 비교기를 반환한다. 여기서는 열을 정렬하려고하기 때문에 여기에 필요한 것이 아닙니다.

대신 사용하기 위해 비교기를 허용하는 reverseOrder 버전을 사용하십시오. 그래서 Collections.reverseOrder(BY_VAL), Collections.reverseOrder(BY_STR), ...

+0

@ greg-449 : 정렬 기능을 만들기 위해 개별 클래스를 만듭니다. 나는 아래에 주어진 전체 코드를 공유한다. 이 좋은 코드를 최적화해야한다. –

+1

StackOverflow는 특정 프로그래밍 문제를 묻는 것입니다. 다른 사람이 ** working ** 코드의 품질에 대해 의견을 말하게하려면 [Code Review] (https://codereview.stackexchange.com/)에서 물어보십시오. –