jdk1.5表格排序
public class TableSort {
final static Icon upIcon = new UpDownArrow(0);
final static Icon downIcon = new UpDownArrow(1);
private boolean ascending=false;
private TableModel model;
private int sortColumn=-1;
public static void main(String[] args) {
new TableSort().init();
}
private void init()
{
List<Object[]> list = new Vector<Object[]>();
Object[] obj = null;
for(int i=0;i<50;i++)
{
obj = new Object[3];
String s="";
if(i%2==0)
{
s ="aw";
}
else
{
s="3e";
}
obj[0]="name"+s;
obj[1]= i+(123/(i+1))+2;
obj[2]=i+17.0169/(i+1)*1.1347;
list.add(obj);
}
String[] names ={"姓名","学号","成绩"};
model = new TableModel(names,0);
model.addData(list);
final JTable table = new JTable(model);
// TableRowSorter<TableModel> sort = new TableRowSorter<TableModel>(model);
// CompareTo to = new CompareTo();
// for(int i=0;i<names.length;i++)
// {
// sort.setComparator(i,to);
// }
//SortManager sortManager = new SortManager(table);
// table.setRowSorter(sort);
DefaultTableCellRenderer defaultHeaderRenderer = new SortHeaderRenderer();
defaultHeaderRenderer.setHorizontalAlignment(0);
defaultHeaderRenderer.setHorizontalTextPosition(JLabel.LEFT);
JTableHeader jtableheader = table.getTableHeader();
jtableheader.setDefaultRenderer(defaultHeaderRenderer);
addListener(table);
JScrollPane js = new JScrollPane(table);
JFrame frame = new JFrame();
frame.getContentPane().add(js);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public void addListener(final JTable table)
{
table.getTableHeader().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mouseevent) {
int i = table.columnAtPoint(mouseevent.getPoint());
int j = table.convertColumnIndexToModel(i);
//转换出用户想排序的列和底层数据的列,然后判断
if (j == sortColumn) {
ascending = !ascending;
} else {
ascending = true;
sortColumn = j;
}
model.sort(ascending, sortColumn);
table.revalidate();
table.repaint();
}
});
}
//jdk1.5表头渲染器
class SortHeaderRenderer extends DefaultTableCellRenderer {
public SortHeaderRenderer()
{
}
public Component getTableCellRendererComponent(JTable jtable,
Object obj, boolean flag, boolean flag1, int i, int j) {
if (jtable != null) {
JTableHeader jtableheader = jtable.getTableHeader();
if (jtableheader != null) {
setForeground(jtableheader.getForeground());
setBackground(jtableheader.getBackground());
setFont(jtableheader.getFont());
}
}
setText(obj != null ? obj.toString() : "");
int col = jtable.convertColumnIndexToModel(j);
if (col == sortColumn) {
setIcon(ascending ? TableSort.upIcon : TableSort.downIcon);
} else {
setIcon(null);
}
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
}
}
//表格模型
class TableModel extends DefaultTableModel
{
List<Object[]> dataLst = new ArrayList<Object[]>();
private Compare compare = new Compare();
public TableModel(String[] tableHeaders,int count)
{
super(tableHeaders,count);
}
@Override
public Object getValueAt(int row, int col) {
if(dataLst.size()>0)
{
Object[] obj = dataLst.get(row);
return obj[col];
}
return "";
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public int getRowCount() {
if(null != dataLst)
{
return dataLst.size();
}
return 0;
}
public void sort(boolean desc,int col)
{
compare.setDes(desc);
compare.setCol(col);
java.util.Collections.sort(this.dataLst,compare);
}
public void addData(List<Object[]> objLst)
{
dataLst.addAll(objLst);
this.fireTableDataChanged();
}
}
//jdk1.5排序比较器
class Compare implements Comparator
{
private boolean des;
private int col;
public Compare()
{
this(true,0);
}
public Compare(boolean des,int col)
{
this.des = des;
this.col = col;
}
@Override
public int compare(Object o1, Object o2) {
int result = 0;
if(!(o1 instanceof Object[] )&& !(o2 instanceof Object[]))
{
return -1;
}
else
{
Object[] l1=(Object[])o1;
Object[] l2=(Object[])o2;
Object oo1 = l1[col];
Object oo2 = l2[col];
if(oo1.getClass()==String.class && oo2.getClass()==String.class)
{
String obj1=(String)oo1;
String obj2=(String)oo2;
result = obj1.compareTo(obj2);
}
else if(oo1.getClass()==Double.class && oo2.getClass()==Double.class)
{
Double obj1=(Double)oo1;
Double obj2=(Double)oo2;
double t = obj1-obj2;
if(t>0.00000)
{
result = 1;
}
else if(t<0.00000)
{
result = -1;
}
}
else
{
Integer obj1=(Integer)oo1;
Integer obj2=(Integer)oo2;
result = obj1-obj2;
}
}
if(!des)
{
result = -result;
}
return result;
}
public boolean isDes() {
return des;
}
public void setDes(boolean des) {
this.des = des;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
}
//jdk1.6排序比较器
class CompareTo implements Comparator
{
public CompareTo()
{
}
@Override
public int compare(Object o1, Object o2) {
int result = 0;
if(o1.getClass() != o2.getClass())
{
return -1;
}
else
{
if(o1.getClass()==String.class && o2.getClass()==String.class)
{
String obj1=(String)o1;
String obj2=(String)o2;
result = obj1.compareTo(obj2);
}
else if(o1.getClass()==Double.class && o2.getClass()==Double.class)
{
Double obj1=(Double)o1;
Double obj2=(Double)o2;
double t = obj1-obj2;
if(t>0.00000)
{
result = 1;
}
else if(t<0.00000)
{
result = -1;
}
}
else
{
Integer obj1=(Integer)o1;
Integer obj2=(Integer)o2;
result = obj1-obj2;
}
}
return result;
}
}
//绘制排序图标
class UpDownArrow implements Icon {
private int size = 12;
public static final int UP = 0;
public static final int DOWN = 1;
private int direction;
public UpDownArrow(int i) {
direction = i;
}
public int getIconHeight() {
return size;
}
public int getIconWidth() {
return size;
}
public void paintIcon(Component component, Graphics g, int i, int j) {
int x1 = i + size / 2;
int x = i + 1;
int z = (i + size) - 2;
int y = j + 1;
int y1 = (j + size) - 2;
Color color = (Color) UIManager.get("controlDkShadow");
//画三角形,方向向上
if (direction == 0) {
g.setColor(Color.white);
g.drawLine(x, y1, z, y1);
g.drawLine(z, y1, x1, y);
g.setColor(color);
g.drawLine(x, y1, x1, y);
} else {
g.setColor(color);
g.drawLine(x, y, z, y);
g.drawLine(x, y, x1, y1);
g.setColor(Color.white);
g.drawLine(z, y, x1, y1);
}
//g.dispose();
}
}
jdk1.6表格排序 修改上面文件的init()方法即可
private void init()
{
List<Object[]> list = new Vector<Object[]>();
Object[] obj = null;
for(int i=0;i<50;i++)
{
obj = new Object[3];
String s="";
if(i%2==0)
{
s ="aw";
}
else
{
s="3e";
}
obj[0]="name"+s;
obj[1]= i+(123/(i+1))+2;
obj[2]=i+17.0169/(i+1)*1.1347;
list.add(obj);
}
String[] names ={"姓名","学号","成绩"};
model = new TableModel(names,0);
model.addData(list);
final JTable table = new JTable(model);
TableRowSorter<TableModel> sort = new TableRowSorter<TableModel>(model);
CompareTo to = new CompareTo();
for(int i=0;i<names.length;i++)
{
sort.setComparator(i,to);
}
table.setRowSorter(sort);
// DefaultTableCellRenderer defaultHeaderRenderer = new SortHeaderRenderer();
// defaultHeaderRenderer.setHorizontalAlignment(0);
// defaultHeaderRenderer.setHorizontalTextPosition(JLabel.LEFT);
// JTableHeader jtableheader = table.getTableHeader();
// jtableheader.setDefaultRenderer(defaultHeaderRenderer);
// addListener(table);
JScrollPane js = new JScrollPane(table);
JFrame frame = new JFrame();
frame.getContentPane().add(js);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}