#眉標=AJAX #副標=AJAX開發工具(12) #大標=實作GWT排序換頁資料表 #作者=文圖/沈炳宏 ============= 程式1 public class TableColumn implements IsSerializable { private String name; private String title; public TableColumn() { } public TableColumn(String name, String title) { this.name = name; this.title = title; } getter()... setter()... ================ ============= 程式2 public class DataFilter implements IsSerializable { private String column; private String value; public DataFilter() { } public DataFilter(String column, String value) { this.column = column; this.value = value; } getter()... setter()... ================ ============= 程式3 import com.google.gwt.user.client.rpc. RemoteService; public interface TableModelService extends RemoteService { public TableColumn[] getColumns(); public int getRowsCount(DataFilter[] filters); public String[][] getRows( int startRow, int rowsCount, DataFilter[] filters, String sortColumn, boolean sortOrder); } ================ ============= 程式4 import com.google.gwt.user.client.rpc. AsyncCallback; public interface TableModelServiceAsync { public void getColumns( AsyncCallback callback); public void getRowsCount( DataFilter[] filters, AsyncCallback callback); public void getRows( int startRow, int rowsCount, DataFilter[] filters, String sortColumn, boolean sortOrder, AsyncCallback callback); } ================ ============= 程式5 public class User { private int id; private String firstName; private String lastName; public User(int id, String firstName, String lastName) { this.id = id; this.firstName = firstName; this.lastName = lastName; } getter()... setter()... ================ ============= 程式6 import java.util.Comparator; public class UserComparator implements Comparator { private String sortColumn; private boolean sortingOrder; public UserComparator( String sortColumn, boolean sortingOrder) { this.sortColumn = sortColumn; this.sortingOrder = sortingOrder; } public int compare(User user1, User user2) { Comparable column1 = (Comparable) ReflectionUtils.getPropertyValue( user1, this.sortColumn); Comparable column2 = (Comparable) ReflectionUtils.getPropertyValue( user2, this.sortColumn); int compareResult = -1; if (column1 != null) { if (column2 != null) { compareResult = column1.compareTo(column2); } else { compareResult = 1; } } if (!this.sortingOrder) { compareResult = -1 * compareResult; } return compareResult; } } ================ ============= 程式7 public class UsersTableModelServiceImpl extends RemoteServiceServlet implements TableModelService { private TableColumn[] columns = new TableColumn[] { ... }; private User[] allUsers = new User[] { ... }; ... public TableColumn[] getColumns() { return this.columns; } public int getRowsCount(DataFilter[] filters) { ... } public String[][] getRows(int startRow, int rowsCount, DataFilter[] filters, String sortColumn, boolean sortingOrder) { ... } private User[] getRowsData(int startRow, int rowsCount,DataFilter[] filters, String sortColumn, boolean sortingOrder) { applyDataFilters(filters); applySorting(sortColumn, sortingOrder); ... } private void applyDataFilters(DataFilter[] filters) {...} private void applySorting(String sortColumn, boolean sortingOrder) { ... } ================ ============= 程式8 public AdvancedTable() { final FlowPanel contentFlowPanel = new FlowPanel(); initWidget(contentFlowPanel); grid = new Grid(); … contentFlowPanel.add(grid); final HorizontalPanel navigationPanel = new HorizontalPanel(); contentFlowPanel.add(navigationPanel); … final Button buttonRefresh = new Button(); navigationPanel.add(buttonRefresh); … statusLabel = new Label(); navigationPanel.add(statusLabel); … buttonFirstPage = new Button(); navigationPanel.add(buttonFirstPage); … buttonPrevPage = new Button(); navigationPanel.add(buttonPrevPage); … buttonNextPage = new Button(); navigationPanel.add(buttonNextPage); … buttonLastPage = new Button(); navigationPanel.add(buttonLastPage); … } ================ ============= 程式9 private void buttonFirstPageClicked() { this.currentPageIndex = 0; this.updateRows(); } private void buttonPrevPageClicked() { if (this.currentPageIndex > 0) { this.currentPageIndex--; this.updateRows(); } } private void buttonNextPageClicked() { int pagesCount = calcPagesCount(); if (this.currentPageIndex < pagesCount-1) { this.currentPageIndex++; this.updateRows(); } } private void buttonLastPageClicked() { int pagesCount = calcPagesCount(); this.currentPageIndex = pagesCount; this.updateRows(); } ================ ============= 程式10 private void updateRows() { int pagesCount = calcPagesCount(); if (this.currentPageIndex >= pagesCount) { this.currentPageIndex = pagesCount-1; } this.currentPageStartRow = this.currentPageIndex * this.pageSize; this.currentPageRowsCount = this.pageSize; if (this.currentPageStartRow+ this.currentPageRowsCount > this.totalRowsCount) { this.currentPageRowsCount = this.totalRowsCount % this.pageSize; } this.tableModelService.getRows( this.currentPageStartRow, this.currentPageRowsCount, this.filters, this.sortColumnName, this.sortOrder, new AsyncCallback() { public void onFailure(Throwable caught) { … } public void onSuccess(Object result) { AdvancedTable.this.pageRows = (String[][]) result; AdvancedTable.this.redrawRows(); } }); } ================ ============= 程式11 private void cellClicked( int row, int column) { if (row == 0) { String columnName = this.columns[column].getName(); this.applySorting(columnName); } else { if (row <= this.currentPageRowsCount) { selectRow(row); } } redrawSelectedRow(); } ================ ============= 程式12 private void applySorting(String column) { if (column.equals(this.sortColumnName)) { applySorting(this.sortColumnName, ! this.sortOrder); } else { applySorting(column, true); } } public void applySorting(String sortColumnName, boolean sortOrder) { this.sortColumnName = sortColumnName; this.sortOrder = sortOrder; redrawColumnTitles(); updateRows(); } private void redrawColumnTitles() { for (int col=0; col============== ============= 程式13 public void onClick(Widget sender) { String filterText = textBoxFilter.getText(); DataFilter filter = new DataFilter ("keyword", filterText); DataFilter[] filters = {filter}; table.applyFilters(filters); labelMessages.setText ("套用過濾器: '" + filterText +"'."); } ================ ============= 程式14 public void updateTableData() { this.currentPageIndex = 0; grid.resizeRows(1 + this.pageSize); this.updateRowsCount(new AsyncCallback() { public void onFailure(Throwable caught) { } public void onSuccess(Object result) { AdvancedTable.this.updateRows(); } }); } ================