说实话,这个JTable排序的方法真的是很经典,网上找了很多,也试了很多。网上很多的方法都很复杂,代码也很多。其实实现排序并不难,关键是不能和JTable上的任何操作有冲突。这个方法,不但不改变现有的Model,而且代码非常的简练。
刚得到它的时候,只能进行一个方向的排序,不能反向排序。于是,我修改了一下,把sun带的Arrays类中的方法改装了一下。这样就实现了双向的排序。好东西啊!!!
代码如下:
一共两个类SortManager、UpDownArrow。用法很简单,只要把你的JTable对象放到SortManager 对象的参数里就可以了,剩下的仔细看看就会明白的!
SortManager sortManager = new SortManager(JTable对象);
import
java.awt.
*
;
import java.awt.event. * ;
import java.util. * ;
import javax.swing. * ;
import javax.swing.event. * ;
import javax.swing.table. * ;
import org.swing2cn.util. * ;
public class SortManager implements TableModelListener {
final static Icon upIcon = new UpDownArrow( 0 );
final static Icon downIcon = new UpDownArrow( 1 );
private JTable table;
private TableModel dataModel;
private int sortColumn;
private Row rows[];
private boolean ascending;
private int sortableColumns[];
public SortManager(JTable jtable) {
rows = null ;
ascending = true ;
sortableColumns = null ;
table = jtable;
int i = 0 ;
int length = jtable.getModel().getColumnCount();
final int [] columns = new int [length];
for (;i < length;i ++ ) {
columns[i] = i;
}
sortableColumns = columns;
initialize();
}
public SortManager(JTable jtable, int i) {
rows = null ;
ascending = true ;
sortableColumns = null ;
table = jtable;
sortColumn = i;
initialize();
}
public SortManager(JTable jtable, int ai[]) {
this (jtable, ai[ 0 ]);
sortableColumns = ( int []) ai.clone();
}
public void initialize() {
dataModel = table.getModel();
((AbstractTableModel) dataModel).addTableModelListener( this );
addMouseListener(table);
JTableHeader jtableheader = table.getTableHeader();
jtableheader.setDefaultRenderer(createHeaderRenderer());
if (table.getRowCount() > 0 ) {
reinitialize();
}
}
protected TableCellRenderer createHeaderRenderer() {
DefaultTableCellRenderer defaultHeaderRenderer = new SortHeaderRenderer();
defaultHeaderRenderer.setHorizontalAlignment( 0 );
defaultHeaderRenderer.setHorizontalTextPosition( 2 );
return defaultHeaderRenderer;
}
public void reinitialize() {
rows = null ;
if (table.getRowCount() > 0 ) {
rows = new Row[table.getRowCount()];
for ( int i = 0 ; i < rows.length; i ++ ) {
rows[i] = new Row();
rows[i].index = i;
}
if (columnIsSortable(sortColumn)) {
sort();
}
}
}
private boolean columnIsSortable( int i) {
if (rows != null ) {
if (sortableColumns != null ) {
for ( int j = 0 ; j < sortableColumns.length; j ++ ) {
if (i == sortableColumns[j]) {
return true ;
}
}
} else {
return true ;
}
}
return false ;
}
public void addMouseListener( 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 ( ! columnIsSortable(j)) {
return ;
}
if (j == sortColumn) {
ascending = ! ascending;
} else {
ascending = true ;
sortColumn = j;
}
sort();
}
} );
}
public void sort() {
if (rows == null ) {
return ;
} else {
((AbstractTableModel) dataModel).removeTableModelListener( this );
Arrays.sort(rows);
resetData();
((AbstractTableModel) dataModel).fireTableDataChanged();
((AbstractTableModel) dataModel).addTableModelListener( this );
table.revalidate();
table.repaint();
return ;
}
}
public void resetData() {
Vector data = new Vector(dataModel.getRowCount());
int i = 0 ;
for (;i < dataModel.getRowCount();i ++ ) {
int j = 0 ;
final Vector vv = new Vector(dataModel.getColumnCount());
for (;j < dataModel.getColumnCount();j ++ ) {
vv.add(dataModel.getValueAt(i,j));
}
data.add(vv);
}
i = 0 ;
for (;i < rows.length;i ++ ) {
if (rows[i].index != i) {
int j = 0 ;
final Vector vv = (Vector)data.get(rows[i].index);
for (;j < dataModel.getColumnCount();j ++ ) {
dataModel.setValueAt(vv.get(j),i,j);
}
}
}
}
public void tableChanged(TableModelEvent tablemodelevent) {
reinitialize();
}
private class SortHeaderRenderer extends DefaultTableCellRenderer {
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 k = jtable.convertColumnIndexToModel(j);
if (k == sortColumn) {
setIcon(ascending ? SortManager.upIcon : SortManager.downIcon);
} else {
setIcon( null );
}
setBorder(UIManager.getBorder( " TableHeader.cellBorder " ));
return this ;
}
}
private class Row implements Comparable {
private Row() {
}
public int compareTo(Object obj) {
Row row = (Row) obj;
java.text.Collator cnCollator = java.text.Collator.getInstance(Locale.getDefault());
Object obj1 = dataModel.getValueAt(index, sortColumn);
Object obj2 = dataModel.getValueAt(row.index, sortColumn);
if (ascending) {
if ( ! (obj1 instanceof Comparable)) {
return - 1 ;
}
if ( ! (obj2 instanceof Comparable)) {
return 1 ;
} else {
}
}
if ( ! (obj1 instanceof Comparable)) {
return 1 ;
}
if ( ! (obj2 instanceof Comparable)) {
return - 1 ;
} else {
return cnCollator.compare(obj2,obj1);
}
}
public int index;
}
}
import java.awt.event. * ;
import java.util. * ;
import javax.swing. * ;
import javax.swing.event. * ;
import javax.swing.table. * ;
import org.swing2cn.util. * ;
public class SortManager implements TableModelListener {
final static Icon upIcon = new UpDownArrow( 0 );
final static Icon downIcon = new UpDownArrow( 1 );
private JTable table;
private TableModel dataModel;
private int sortColumn;
private Row rows[];
private boolean ascending;
private int sortableColumns[];
public SortManager(JTable jtable) {
rows = null ;
ascending = true ;
sortableColumns = null ;
table = jtable;
int i = 0 ;
int length = jtable.getModel().getColumnCount();
final int [] columns = new int [length];
for (;i < length;i ++ ) {
columns[i] = i;
}
sortableColumns = columns;
initialize();
}
public SortManager(JTable jtable, int i) {
rows = null ;
ascending = true ;
sortableColumns = null ;
table = jtable;
sortColumn = i;
initialize();
}
public SortManager(JTable jtable, int ai[]) {
this (jtable, ai[ 0 ]);
sortableColumns = ( int []) ai.clone();
}
public void initialize() {
dataModel = table.getModel();
((AbstractTableModel) dataModel).addTableModelListener( this );
addMouseListener(table);
JTableHeader jtableheader = table.getTableHeader();
jtableheader.setDefaultRenderer(createHeaderRenderer());
if (table.getRowCount() > 0 ) {
reinitialize();
}
}
protected TableCellRenderer createHeaderRenderer() {
DefaultTableCellRenderer defaultHeaderRenderer = new SortHeaderRenderer();
defaultHeaderRenderer.setHorizontalAlignment( 0 );
defaultHeaderRenderer.setHorizontalTextPosition( 2 );
return defaultHeaderRenderer;
}
public void reinitialize() {
rows = null ;
if (table.getRowCount() > 0 ) {
rows = new Row[table.getRowCount()];
for ( int i = 0 ; i < rows.length; i ++ ) {
rows[i] = new Row();
rows[i].index = i;
}
if (columnIsSortable(sortColumn)) {
sort();
}
}
}
private boolean columnIsSortable( int i) {
if (rows != null ) {
if (sortableColumns != null ) {
for ( int j = 0 ; j < sortableColumns.length; j ++ ) {
if (i == sortableColumns[j]) {
return true ;
}
}
} else {
return true ;
}
}
return false ;
}
public void addMouseListener( 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 ( ! columnIsSortable(j)) {
return ;
}
if (j == sortColumn) {
ascending = ! ascending;
} else {
ascending = true ;
sortColumn = j;
}
sort();
}
} );
}
public void sort() {
if (rows == null ) {
return ;
} else {
((AbstractTableModel) dataModel).removeTableModelListener( this );
Arrays.sort(rows);
resetData();
((AbstractTableModel) dataModel).fireTableDataChanged();
((AbstractTableModel) dataModel).addTableModelListener( this );
table.revalidate();
table.repaint();
return ;
}
}
public void resetData() {
Vector data = new Vector(dataModel.getRowCount());
int i = 0 ;
for (;i < dataModel.getRowCount();i ++ ) {
int j = 0 ;
final Vector vv = new Vector(dataModel.getColumnCount());
for (;j < dataModel.getColumnCount();j ++ ) {
vv.add(dataModel.getValueAt(i,j));
}
data.add(vv);
}
i = 0 ;
for (;i < rows.length;i ++ ) {
if (rows[i].index != i) {
int j = 0 ;
final Vector vv = (Vector)data.get(rows[i].index);
for (;j < dataModel.getColumnCount();j ++ ) {
dataModel.setValueAt(vv.get(j),i,j);
}
}
}
}
public void tableChanged(TableModelEvent tablemodelevent) {
reinitialize();
}
private class SortHeaderRenderer extends DefaultTableCellRenderer {
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 k = jtable.convertColumnIndexToModel(j);
if (k == sortColumn) {
setIcon(ascending ? SortManager.upIcon : SortManager.downIcon);
} else {
setIcon( null );
}
setBorder(UIManager.getBorder( " TableHeader.cellBorder " ));
return this ;
}
}
private class Row implements Comparable {
private Row() {
}
public int compareTo(Object obj) {
Row row = (Row) obj;
java.text.Collator cnCollator = java.text.Collator.getInstance(Locale.getDefault());
Object obj1 = dataModel.getValueAt(index, sortColumn);
Object obj2 = dataModel.getValueAt(row.index, sortColumn);
if (ascending) {
if ( ! (obj1 instanceof Comparable)) {
return - 1 ;
}
if ( ! (obj2 instanceof Comparable)) {
return 1 ;
} else {
}
}
if ( ! (obj1 instanceof Comparable)) {
return 1 ;
}
if ( ! (obj2 instanceof Comparable)) {
return - 1 ;
} else {
return cnCollator.compare(obj2,obj1);
}
}
public int index;
}
}
import
java.awt.
*
;
import javax.swing. * ;
public 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 k = i + size / 2 ;
int l = i + 1 ;
int i1 = (i + size) - 2 ;
int j1 = j + 1 ;
int k1 = (j + size) - 2 ;
Color color = (Color) UIManager.get( " controlDkShadow " );
if (direction == 0 ) {
g.setColor(Color.white);
g.drawLine(l, k1, i1, k1);
g.drawLine(i1, k1, k, j1);
g.setColor(color);
g.drawLine(l, k1, k, j1);
} else {
g.setColor(color);
g.drawLine(l, j1, i1, j1);
g.drawLine(l, j1, k, k1);
g.setColor(Color.white);
g.drawLine(i1, j1, k, k1);
}
}
}
import javax.swing. * ;
public 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 k = i + size / 2 ;
int l = i + 1 ;
int i1 = (i + size) - 2 ;
int j1 = j + 1 ;
int k1 = (j + size) - 2 ;
Color color = (Color) UIManager.get( " controlDkShadow " );
if (direction == 0 ) {
g.setColor(Color.white);
g.drawLine(l, k1, i1, k1);
g.drawLine(i1, k1, k, j1);
g.setColor(color);
g.drawLine(l, k1, k, j1);
} else {
g.setColor(color);
g.drawLine(l, j1, i1, j1);
g.drawLine(l, j1, k, k1);
g.setColor(Color.white);
g.drawLine(i1, j1, k, k1);
}
}
}