请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 207|回复: 2

JTable 排序的问题

[复制链接]
发表于 2018-5-10 10:55:36 | 显示全部楼层 |阅读模式
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());
                                }
                        }
                }
       
}

当我点击 姓名 排序的时候  不是按照字符串的长度进行排序吗?
为什么 李清照 总是排在第二位呢?

发表于 2018-5-10 14:49:34 | 显示全部楼层
  return a.toString().compareTo(b.toString());
看这里,是按字符串大小比较大小的。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-5-10 23:10:21 | 显示全部楼层
kongyeeku 发表于 2018-5-10 14:49
return a.toString().compareTo(b.toString());
看这里,是按字符串大小比较大小的。

谢谢 原来是按照字典顺序比较的  一直以为是字符串长度
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2018-10-21 22:14 , Processed in 0.260520 second(s), 7 queries , File On.

快速回复 返回顶部 返回列表