JTable 排序的问题

zhuailhw123 2018-05-10 10:47:59
public class SortTable {
JFrame jf=new JFrame("测试");
Object [][] tableData=
{
{"李清照",99,"女"},
{"苏格拉底",30,"男"},
{"李",35,"男"},
{"李白",40,"按"},
{"那附近那个是",58,"男"}
};
Object [] columnTitle= {"姓名","年龄","性别"};
JTable table=new JTable(tableData,columnTitle);
SortableTableModel sorterModel=new SortableTableModel(table.getModel());
public void init()
{
table.setModel(sorterModel);
table.getTableHeader().addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent event)
{
if(event.getClickCount()<2)
return;
int tableColumn=table.columnAtPoint(event.getPoint());
int modelColumn=table.convertColumnIndexToModel(tableColumn);
sorterModel.sort(modelColumn);
}
}
);
jf.add(new JScrollPane(table));
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
new SortTable().init();


}

}
class SortableTableModel extends AbstractTableModel
{


private TableModel model;
private int sortColumn;
private Row[] rows;
// 将一个已经存在TableModel对象包装成SortableTableModel对象
public SortableTableModel(TableModel m)
{
// 将被封装的TableModel传入
model = m;
rows = new Row[model.getRowCount()];
// 将原TableModel中的每行记录的索引使用Row数组保存起来
for (int i = 0; i < rows.length; i++)
{
rows[i] = new Row(i);
}
}
// 实现根据指定列进行排序
public void sort(int c)
{
sortColumn = c;
java.util.Arrays.sort(rows);
//fireTableDataChanged();
updateUI();
}

private void updateUI() {
// TODO Auto-generated method stub

}
public Object getValueAt(int r, int c)
{
return model.getValueAt(rows[r].index, c);
}
public boolean isCellEditable(int r, int c)
{
return model.isCellEditable(rows[r].index, c);
}
public void setValueAt(Object aValue, int r, int c)
{
model.setValueAt(aValue, rows[r].index, c);
}
// 下面方法的实现把该model的方法委托为原封装的model来实现

public int getRowCount()
{
return model.getRowCount();
}
public int getColumnCount()
{
return model.getColumnCount();
}
public String getColumnName(int c)
{
return model.getColumnName(c);
}
public Class getColumnClass(int c)
{
return model.getColumnClass(c);
}

private class Row implements Comparable<Row>
{
// 该index保存着被封装Model里每行记录的行索引
public int index;
public Row(int index)
{
this.index = index;
}
// 实现两行之间的大小比较
public int compareTo(Row other)
{
Object a = model.getValueAt(index, sortColumn);
Object b = model.getValueAt(other.index, sortColumn);
if (a instanceof Comparable)
{
System.out.println(a);
return ((Comparable)a).compareTo(b);
}
else
{
return a.toString().compareTo(b.toString());
}
}
}

}

当我点击 姓名 排序的时候 不是按照字符串的长度进行排序吗?
为什么 李清照 总是排在第二位呢?
...全文
345 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgqjava 2018-05-10
  • 打赏
  • 举报
回复
字符串的默认排序是按自然顺序为标准的 而不是字符长度 所以你要自己重写排序规则
zhuailhw123 2018-05-10
  • 打赏
  • 举报
回复
字符串的默认排序是按自然顺序为标准的 而不是字符长度 所以你要自己重写排序规则
zhuailhw123 2018-05-10
  • 打赏
  • 举报
回复
字符串的 comparaTo 不是以字符串的长度为标准吗?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧