您可以采取两个方向,第一个是更改 SQL 并使用 ORDER BY 子句检索正确排序的数据。第二种方法应该动态地与任何表一起工作:
对于动态可排序表,您需要做更多的工作。我改编了 JavaDoc 中的现有表示例以支持排序。目前我只是为字符串列做了这个,但你可以很容易地替换比较器来做你想做的事......
Form hi = new Form("Table", new BorderLayout());
TableModel model = new DefaultTableModel(new String[] {"Col 1", "Col 2", "Col 3"}, new Object[][] {
{"Row 1", "Row A", "Row X"},
{"Row 2", "Row B", "Row Y"},
{"Row 3", "Row C", "Row Z"},
{"Row 4", "Row D", "Row K"},
}) {
public boolean isCellEditable(int row, int col) {
return col != 0;
}
};
Table table = new Table(model) {
private int currentSortedColum = -1;
private boolean asc;
private Button lastSortedColumnButton;
private void setArrow(int column, Button b) {
if(column == currentSortedColum) {
if(asc) {
FontImage.setMaterialIcon(b, FontImage.MATERIAL_ARROW_UPWARD);
} else {
FontImage.setMaterialIcon(b, FontImage.MATERIAL_ARROW_DOWNWARD);
}
} else {
FontImage.setMaterialIcon(b, FontImage.MATERIAL_SORT);
}
}
@Override
protected Component createCell(Object value, int row, int column, boolean editable) { // (1)
Component cell;
if(row == -1) {
// table header
cell = new Button("" + value, "TableHeader");
setArrow(column, ((Button)cell));
((Button)cell).setTextPosition(LEFT);
((Button)cell).addActionListener(e -> {
if(currentSortedColum != column && lastSortedColumnButton != null) {
FontImage.setMaterialIcon(lastSortedColumnButton, FontImage.MATERIAL_SORT);
}
lastSortedColumnButton = (Button)cell;
if(column == currentSortedColum) {
asc = !asc;
} else {
currentSortedColum = column;
asc = false;
}
setArrow(column, lastSortedColumnButton);
setModel(new SortedTableModel(currentSortedColum, asc, model, new CaseInsensitiveOrder()));
});
} else {
cell = super.createCell(value, row, column, editable);
}
if(row > -1 && row % 2 == 0) {
// pinstripe effect
cell.getAllStyles().setBgColor(0xeeeeee);
cell.getAllStyles().setBgTransparency(255);
}
return cell;
}
};
hi.add(BorderLayout.CENTER, table);
hi.show();
为此,您需要排序模型:
class SortedTableModel implements TableModel {
private TableModel model;
private int[] sorted;
public SortedTableModel(int column, boolean asc, TableModel model, Comparator cmp) {
this.model = model;
sorted = new int[model.getRowCount()];
Integer[] sortedTemp = new Integer[sorted.length];
for(int iter = 0 ; iter < sorted.length ; iter++) {
sortedTemp[iter] = iter;
}
// sort(int[]) doesn't accept a comparator how stupid is that...
Arrays.sort(sortedTemp, (Object o1, Object o2) -> {
int i1 = (Integer)o1;
int i2 = (Integer)o2;
if(asc) {
return cmp.compare(model.getValueAt(i1, column), model.getValueAt(i2, column)) * -1;
}
return cmp.compare(model.getValueAt(i1, column), model.getValueAt(i2, column));
}
);
for(int iter = 0 ; iter < sorted.length ; iter++) {
sorted[iter] = sortedTemp[iter];
}
}
@Override
public int getRowCount() {
return model.getRowCount();
}
@Override
public int getColumnCount() {
return model.getColumnCount();
}
@Override
public String getColumnName(int i) {
return model.getColumnName(i);
}
@Override
public boolean isCellEditable(int row, int column) {
return model.isCellEditable(sorted[row], column);
}
@Override
public Object getValueAt(int row, int column) {
return model.getValueAt(sorted[row], column);
}
@Override
public void setValueAt(int row, int column, Object o) {
model.setValueAt(sorted[row], column, o);
}
@Override
public void addDataChangeListener(DataChangedListener d) {
model.addDataChangeListener(d);
}
@Override
public void removeDataChangeListener(DataChangedListener d) {
model.removeDataChangeListener(d);
}
}
它产生这个: