// getRealModel方法被子類用來引用真實對象。
protected TableModel getRealModel() {
return realModel;
}
private TableModel realModel; // 真實對象
}
注意到TableModelDecorator的構造函數僅僅實現了傳遞方法調用的功能。
// TableSortDecorator.java
import javax.swing.table.TableModel;
public abstract class TableSortDecorator extends
TableModelDecorator {
// 實現TableSortDecorator接口的類必須實現sort()方法。除此之外,
// 還需要實現TableModelDecorator中的tableChanged()方法。
abstract public void sort(int column);
public TableSortDecorator(TableModel realModel) {
super(realModel);
}
}
// TableBubbleSortDecorator.java
import javax.swing.table.TableModel;
import javax.swing.event.TableModelEvent;
public class TableBubbleSortDecorator extends TableSortDecorator {
// 該類的構造函數需要一個TableModel的實例作為參數。
// 該類為表模型增加了排序功能。
public TableBubbleSortDecorator(TableModel model) {
super(model);
allocate();
}
// tableChanged()方法是被定義在TableModelListener接口中的。
// TableModelDecorator繼承了TableModelListener接口。
public void tableChanged(TableModelEvent e) {
allocate();
}
// 兩個TableModel中的方法被重載。
public Object getValueAt(int row, int column) {
return getRealModel().getValueAt(indexes[row], column);
}
public void setValueAt(Object aValue, int row, int column) {
getRealModel().setValueAt(aValue, indexes[row], column);
}
// 簡單的冒泡排序
public void sort(int column) {
int rowCount = getRowCount();
for(int i=0; i < rowCount; i++) {
for(int j = i+1; j < rowCount; j++) {
if(compare(indexes[i], indexes[j], column) < 0) {
swap(i,j);
}
}
}
}
private void swap(int i, int j) {
int tmp = indexes[i];
indexes[i] = indexes[j];
indexes[j] = tmp;
}
private int compare(int i, int j, int column) {
TableModel realModel = getRealModel();
Object io = realModel.getValueAt(i,column);
Object jo = realModel.getValueAt(j,column);
int c = jo.toString().compareTo(io.toString());
return (c < 0) ? -1 : ((c > 0) ? 1 : 0);
}
private void allocate() {
indexes = new int[getRowCount()];
for(int i=0; i < indexes.length; ++i) {
indexes[i] = i;
}
}
private int indexes[];
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/