这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求。由于我是大神,所以必须做了出来。ok,不自恋了,先上效果图,然后上代码,最后上项目。这也将是我以后的一贯风格,懂得分享才能走的更高!

 
  简单描述一下,瞅准某列,第一次点击升序,第二次点击降序,第三次点击取消排序。图为先按密码升序,然后按用户名升序,最后按年龄降序。
 
  一、 准备工作,及整体思路
 
  我的环境,jdk1.6,jdk1.7,jdk1.8均测试过。公司用的是1.6,本人上传此博客的环境为1.8。IDE 工具Eclipse Jee Neon,TableModel,List<T>。
  思路:新建frame,new Jtable(我用的是tableModel创建的方式),设置Jtable样式,给Jtable绑定表头排序事件,给Jtable绑定表头图标事件。在表头排序事件中将要排序列名传递给排序工具类(此工具类主要作用是维护哪几列用来排序,别着急,下面有代码),然后按此列进行排序,实现一个排序用的comparator类(自定义排序,当做int来排序,String排序,Long排序等)。
 
 
  二、代码
 
  1. 主类(new frame)
 package com.test.order;

 import java.awt.Dimension;

 public class TableOrder3Test {
// private static int width = 600;
// private static int height = 600; public static void main(String[] args) {
displayTable(); } public static void displayTable(){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// 设置程序界面外观
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception localException1) {
try {
UIManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());
} catch (Exception localException2) {
localException2.printStackTrace();
}
} JFrame tableFrame = new JFrame("表格排序"); TableOrder3Table order3Talbe = new TableOrder3Table(); tableFrame.setContentPane(new JScrollPane(order3Talbe.initUI())); Toolkit kit = Toolkit.getDefaultToolkit();//获得窗口超类
Dimension dim = kit.getScreenSize();//获得当前屏幕
// tableFrame.setLocation(((int)dim.getWidth()-width)/2,
// (int)(dim.getHeight()-height)/2);//设置frame距离左和上的偏移量,即窗口显示的位置
// tableFrame.setLocationRelativeTo(null);
tableFrame.setSize(dim);//调整屏幕大小
// tableFrame.setSize(200, 200);//调整屏幕大小
tableFrame.setResizable(true);//是否可调整大小
tableFrame.setVisible(true);//是否显示
tableFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//按叉之后执行哪个操作
}
});
}
}
  2. 关于Jtable类的代码(下面的3,4,5,6,7中的类都将在此类中出现,注意它们在此类中的角色)
 package com.test.order;

 import java.awt.Component;

 public class TableOrder3Table{

     private TableOrder3TableMode tabelMode;
private JTable order3Table;
private List<User> userList;
private TableOrderSorter tableOrderSorterUtil; public JTable initUI(){ getData();
tabelMode = new TableOrder3TableMode(userList);//获取model
order3Table = new JTable();
order3Table.setModel(tabelMode);//设置model
addHeaderEvent();//添加对表头排序事件
setSorterIconToTableHeader(order3Table.getTableHeader());//添加表头排序图标
return order3Table;
} /**
* 添加对表头排序事件
*/
public void addHeaderEvent(){
order3Table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent evt) {
if(evt.getButton() == MouseEvent.BUTTON1 && evt.getClickCount() == 1){ //判断左键右键,点击了几次
int selectedColumn = order3Table.getTableHeader().columnAtPoint(evt.getPoint());//得到该鼠标点击列的column,从0开始
String sortColumn = tabelMode.getColumnObjectName(selectedColumn);//获得排序列名
SorterColumnGroupUtil.setColumn(sortColumn);//设置排序列,SorterColumnGroupUtil类便是用来维护排序列的工具类
userSort();//表格列排序
}
}
});
} /**
* 为表格表头添加排序图标
* @param tableHeader
*/
@SuppressWarnings("serial")
public void setSorterIconToTableHeader(JTableHeader tableHeader) {
tableHeader.setDefaultRenderer(new DefaultTableCellRenderer(){//添加tableheader渲染器 private Font TABLE_FONT = new Font("宋体", Font.PLAIN, 15);
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JButton btn = new TableHeaderButton();//JideTool.newJideButton();
btn.setText(value == null ? "" : value.toString());
btn.setFont(TABLE_FONT);
String sortColumnName ="";
sortColumnName = tabelMode.getColumnObjectName(column);
if(sortColumnName.equals(SorterColumnGroupUtil.getColumn1())){
if (Constant.ASC.equals(SorterColumnGroupUtil.getColumn1Asc())) {
btn.setIcon(getIconResource("arr-up1.png"));
} else if (Constant.DESC.equals(SorterColumnGroupUtil.getColumn1Asc())){
btn.setIcon(getIconResource("arr-down1.png"));
}
}else if(sortColumnName.equals(SorterColumnGroupUtil.getColumn2())){
if (Constant.ASC.equals(SorterColumnGroupUtil.getColumn2Asc())) {
btn.setIcon(getIconResource("arr-up2.png"));
} else if (Constant.DESC.equals(SorterColumnGroupUtil.getColumn2Asc())){
btn.setIcon(getIconResource("arr-down2.png"));
}
}else if(sortColumnName.equals(SorterColumnGroupUtil.getColumn3())){
if (Constant.ASC.equals(SorterColumnGroupUtil.getColumn3Asc())) {
btn.setIcon(getIconResource("arr-up3.png"));
} else if (Constant.DESC.equals(SorterColumnGroupUtil.getColumn3Asc())){
btn.setIcon(getIconResource("arr-down3.png"));
}
}
return btn;
}
});
} /**
* 稍稍封装了获得icon的过程,默认搜索
*/
public static ImageIcon getIconResource(String iconName)
{
return new ImageIcon("icon/"+iconName);
} /**
* 表格列排序
*/
public void userSort() {
Collections.sort(tabelMode.getList(), getOrderTableSorter());//将要排序的数据及自定义的排序类传给Collections
order3Table.updateUI();
} /**
* 获得排序类接口
* @return
*/
public TableOrderSorter getOrderTableSorter(){
if(tableOrderSorterUtil == null){
tableOrderSorterUtil = new TableOrderSorter();
}
return tableOrderSorterUtil;
} /**
* 设置表格样式
*/
public void setStyle(){
order3Table.getColumnModel().getColumn(2).setPreferredWidth(10);
order3Table.setRowHeight(25);
} /**
* 添加对表格内容的事件
*/
public void addEvent(){
order3Table.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e) {//仅当鼠标单击时响应
//得到选中的行列的索引值
int r= order3Table.getSelectedRow();
int c= order3Table.getSelectedColumn();
//得到选中的单元格的值,表格中都是字符串
Object value= order3Table.getValueAt(r, c);
String info=r+"行"+c+"列值 : "+value.toString();
javax.swing.JOptionPane.showMessageDialog(null,info);
}
});
} /**
* 获取模拟数据
*/
public void getData(){
userList = new ArrayList<User>();
User user1 = new User(1, "大元帅", "哈", 18, "ddd", "eee");
User user2 = new User(11, "帅帅", "bbb", 18, "drdfrt", "aba");
User user3 = new User(10, "阿哥好帅", "dsd", 18, "dnca", "aba");
User user4 = new User(2, "巴拉拉", "sdf", 18, "wer", "aba");
User user5 = new User(3, "小魔仙", "abc", 18, "gm", "aba");
User user6 = new User(5, "嘚嘚", "sd", 20, "dsz", "aba");
User user7 = new User(21, "服啦服啦", "ddd", 21, "nhd", "aba");
User user8 = new User(22, "啦啦", "bbb", 22, "dhsa", "aba");
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
userList.add(user8);
}
}

  3. 关于tableModel的代码

 package com.test.order;

 import java.util.List;

 public class TableOrder3TableMode implements TableModel{

     private List<User> userList;

     public TableOrder3TableMode(List<User> userList){
this.userList = userList;
} @Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
} @Override
public int getColumnCount() { return 6;
} @Override
public int getRowCount() {
return userList.size();
} @Override
public String getColumnName(int columnIndex) {
if(columnIndex == 0)
return "id";
if(columnIndex == 1)
return "用户名";
if(columnIndex == 2)
return "密码";
if(columnIndex == 3)
return "年龄";
if(columnIndex == 4)
return "邮箱";
if(columnIndex == 5)
return "地址";
else return null; } @Override
public Object getValueAt(int rowIndex, int columnIndex) {
User user = userList.get(rowIndex);
if(columnIndex == 0)
return user.getId();
if(columnIndex == 1)
return user.getUserName();
if(columnIndex == 2)
return user.getUserPassword();
if(columnIndex == 3)
return user.getAge();
if(columnIndex == 4)
return user.getEmail();
if(columnIndex == 5)
return user.getAddress();
return null;
} /**
* 如果表格可以编辑,当编辑完按下enter后则会自动调用该方法
*/
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
String s="Change at: "+rowIndex+"--- "+columnIndex+" newValue: "+aValue;
System.out.println(s); } @Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if(columnIndex == 0)
return false;
return true;
} @Override
public void removeTableModelListener(TableModelListener l) {
// TODO Auto-generated method stub }
@Override
public void addTableModelListener(TableModelListener l) {
// TODO Auto-generated method stub } public List<User> getList(){
return this.userList;
} public String getColumnObjectName(int columnIndex) {
if(columnIndex == 0)
return User.ID;
if(columnIndex == 1)
return User.USERNAME;
if(columnIndex == 2)
return User.USERPASSWORD;
if(columnIndex == 3)
return User.AGE;
if(columnIndex == 4)
return User.EMAIL;
if(columnIndex == 5)
return User.ADDRESS;
else return null;
} }

  4. 维护排序列的类(SorterColumnGroupUtil)

  类的主要作用及思路:维护排序列,最多支持3列同时排序。当收到列名时,首先判断(第一主列==null),如果为空,则将该列名设为第一主列;否则判断(!=第一主列 && 第二主列==null),是则设为第二主列;否则判断(!=第一主列 && !=第二主列 && 第三主列==null),是则设为第三主列;否则则说明三个主列都有了。接下来就是判断是否等于三个主列中的其中一个,如果不等于,说明三大主列已经满了,什么都不用做。如果等于,然后判断它是升序还是降序,是升序就将它变成降序,是降序将该主列清空,后面的主列向前面的主列移动。

 package com.test.order.orderutil;

 public class SorterColumnGroupUtil {

 private static String[][] sorterArray = new String[3][2];//排序列数组 

     public static String getColumn1(){//获得第一主排序列名
return sorterArray[0][0];
}
public static String getColumn2(){//获得第二主排序列名
return sorterArray[1][0];
}
public static String getColumn3(){//获得第三主排序列名
return sorterArray[2][0];
}
public static String getColumn1Asc(){//获得第一主排序的升降序
return sorterArray[0][1];
}
public static String getColumn2Asc(){//获得第二主排序的升降序
return sorterArray[1][1];
}
public static String getColumn3Asc(){//获得第三主排序的升降序
return sorterArray[2][1];
} //设置排序列
public static void setColumn(String columnName){
if(columnName != null){//第一主排序不为null,则将该列设为第一主排序,默认升序
if(sorterArray[0][0] == null){
sorterArray[0][0] = columnName;
sorterArray[0][1] = Constant.ASC;
}else if(sorterArray[1][0] == null && !sorterArray[0][0].equals(columnName)){//有第一主排序,且第二主排序不为null,则将该列设为第二主排序,默认升序
sorterArray[1][0] = columnName;
sorterArray[1][1] = Constant.ASC;
}else if(sorterArray[2][0] == null && !sorterArray[0][0].equals(columnName) && !sorterArray[1][0].equals(columnName)){//有第一和第二主排序,且第二主排序不为null,则将该列设为第二主排序,默认升序
sorterArray[2][0] = columnName;
sorterArray[2][1] = Constant.ASC;
}else{
if(columnName.equals(sorterArray[0][0])){//如果等于第一主排序,则讲第一主排序降序
if(Constant.ASC.equals(sorterArray[0][1])){
sorterArray[0][1] = Constant.DESC;
}else if(Constant.DESC.equals(sorterArray[0][1])){//第一主排序为降序,则去掉第一主排序,二变一,三变二,三为空
sorterArray[0][0] = sorterArray[1][0];
sorterArray[0][1] = sorterArray[1][1]; sorterArray[1][0] = sorterArray[2][0];
sorterArray[1][1] = sorterArray[2][1]; sorterArray[2][0] = null;
sorterArray[2][1] = null;
}
}else if(columnName.equals(sorterArray[1][0]) ){//第二主排序 同理
if(Constant.ASC.equals(sorterArray[1][1])){
sorterArray[1][1] = Constant.DESC;
}else if(Constant.DESC.equals(sorterArray[1][1])){
sorterArray[1][0] = sorterArray[2][0];
sorterArray[1][1] = sorterArray[2][1]; sorterArray[2][0] = null;
sorterArray[2][1] = null;
}
}else if(columnName.equals(sorterArray[2][0])){//第三主排序
if(Constant.ASC.equals(sorterArray[2][1])){
sorterArray[2][1] = Constant.DESC;
}else if(Constant.DESC.equals(sorterArray[2][1])){
sorterArray[2][0] = null;
sorterArray[2][1] = null;
}
}
}
}
}
}

  5. 自定义排序类,实现了comparator的类

    5.1 TableOrderSorter

 package com.test.order;

 import java.util.Comparator;

 public class TableOrderSorter implements Comparator<User>{

     @Override
public int compare(User o1, User o2) {
return SorterUtil.compare(o1, o2);
}
}

    5.2 SorterUtil

 package com.test.order.orderutil;

 import java.lang.reflect.Method;

 public class SorterUtil {

     public static int compare(Object o1, Object o2) {
Object o1sorterColumn1 = getFieldByReflect(o1,SorterColumnGroupUtil.getColumn1());  //得到o1 对象的第一主排序列
Object o1sorterColumn2 = getFieldByReflect(o1,SorterColumnGroupUtil.getColumn2());  //得到o1 对象的第二主排序列
Object o1sorterColumn3 = getFieldByReflect(o1,SorterColumnGroupUtil.getColumn3()); //得到o1 对象的第三主排序列
Object o2sorterColumn1 = getFieldByReflect(o2,SorterColumnGroupUtil.getColumn1()); //得到o2 对象的第一主排序列
Object o2sorterColumn2 = getFieldByReflect(o2,SorterColumnGroupUtil.getColumn2()); //得到o2 对象的第二主排序列
Object o2sorterColumn3 = getFieldByReflect(o2,SorterColumnGroupUtil.getColumn3()); //得到o2 对象的第三主排序列
Object sorterColumnAsc1 = SorterColumnGroupUtil.getColumn1Asc();  //第一主排序列
Object sorterColumnAsc2 = SorterColumnGroupUtil.getColumn2Asc();  //第二主排序列
Object sorterColumnAsc3 = SorterColumnGroupUtil.getColumn3Asc();  //第三主排序列
if(sorterColumnAsc1 != null){//判断 1主
if(Constant.ASC.equals(sorterColumnAsc1)){//1 主升
if(sorterColumnAsc2 != null){//判断 2主
if(Constant.ASC.equals(sorterColumnAsc2)){//2 主升
if(sorterColumnAsc3 != null){//判断3主
if(Constant.ASC.equals(sorterColumnAsc3)){//3 主升
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?(compareAsc(o1sorterColumn2,o2sorterColumn2) == 0?
compareAsc(o1sorterColumn3,o2sorterColumn3)
:compareAsc(o1sorterColumn2,o2sorterColumn2))
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2升 3升
}else if(Constant.DESC.equals(sorterColumnAsc3)){//3主降
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?(compareAsc(o1sorterColumn2,o2sorterColumn2) == 0?
compareDesc(o1sorterColumn3,o2sorterColumn3)
:compareAsc(o1sorterColumn2,o2sorterColumn2))
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2升 3降
}
}else{//无 3主
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?(compareAsc(o1sorterColumn2,o2sorterColumn2))
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2升
}
}else if(Constant.DESC.equals(sorterColumnAsc2)){//2主降
if(sorterColumnAsc3 != null){//判断3主
if(Constant.ASC.equals(sorterColumnAsc3)){//3 主升
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?(compareDesc(o1sorterColumn2,o2sorterColumn2) == 0?
compareAsc(o1sorterColumn3,o2sorterColumn3)
:compareDesc(o1sorterColumn2,o2sorterColumn2))
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2降 3升
}else if(Constant.DESC.equals(sorterColumnAsc3)){//3主降
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?(compareDesc(o1sorterColumn2,o2sorterColumn2) == 0?
compareDesc(o1sorterColumn3,o2sorterColumn3)
:compareDesc(o1sorterColumn2,o2sorterColumn2))
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2降 3降
}
}else{//无 3主
return compareAsc(o1sorterColumn1,o2sorterColumn1) == 0?compareDesc(o1sorterColumn2,o2sorterColumn2)
:compareAsc(o1sorterColumn1,o2sorterColumn1);//1升 2降
}
}
}else{//无 2主
return compareAsc(o1sorterColumn1,o2sorterColumn1);//1 升
}
}else if(Constant.DESC.equals(sorterColumnAsc1)){//1 主降
if(sorterColumnAsc2 != null){//判断 2主
if(Constant.ASC.equals(sorterColumnAsc2)){//2 主升
if(sorterColumnAsc3 != null){//判断3主
if(Constant.ASC.equals(sorterColumnAsc3)){//3 主升
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?(compareAsc(o1sorterColumn2,o2sorterColumn2) == 0?
compareAsc(o1sorterColumn3,o2sorterColumn3)
:compareAsc(o1sorterColumn2,o2sorterColumn2))
:compareDesc(o1sorterColumn1,o2sorterColumn1);//1降 2升 3升
}else if(Constant.DESC.equals(sorterColumnAsc3)){//3主降
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?(compareAsc(o1sorterColumn2,o2sorterColumn2) == 0?
compareDesc(o1sorterColumn3,o2sorterColumn3)
:compareAsc(o1sorterColumn2,o2sorterColumn2))
:compareDesc(o1sorterColumn1,o2sorterColumn1);// 1降 2升 3降
}
}else{//无 3主
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?compareAsc(o1sorterColumn2,o2sorterColumn2)
:compareDesc(o1sorterColumn1,o2sorterColumn1);// 1降 2升
}
}else if(Constant.DESC.equals(sorterColumnAsc2)){//2主降
if(sorterColumnAsc3 != null){//判断3主
if(Constant.ASC.equals(sorterColumnAsc3)){//3 主升
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?(compareDesc(o1sorterColumn2,o2sorterColumn2) == 0?
compareAsc(o1sorterColumn3,o2sorterColumn3)
:compareDesc(o1sorterColumn2,o2sorterColumn2))
:compareDesc(o1sorterColumn1,o2sorterColumn1);//1 2 降 , 3 升
}else if(Constant.DESC.equals(sorterColumnAsc3)){//3主降
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?(compareDesc(o1sorterColumn2,o2sorterColumn2) == 0?
compareDesc(o1sorterColumn3,o2sorterColumn3)
:compareDesc(o1sorterColumn2,o2sorterColumn2))
:compareDesc(o1sorterColumn1,o2sorterColumn1);// 1 2 3 降
}
}else{//无 3主
return compareDesc(o1sorterColumn1,o2sorterColumn1) == 0?compareDesc(o1sorterColumn2,o2sorterColumn2)
:compareDesc(o1sorterColumn1,o2sorterColumn1);// 1 2 降
}
}
}else{//无 2主
return compareDesc(o1sorterColumn1,o2sorterColumn1);// 1降
}
}
}else{//无 1 主
return 0;
}
return 0;
} /**
* 自动寻找合适的升序序选择器
* @param o1
* @param o2
* @return
*/
public static int compareAsc(Object o1,Object o2){
if (o1 instanceof String) { //字符串
return compareAsc( (String) o1, (String) o2);
}else if (o1 instanceof Integer) { //Integer
return compareAsc( (Integer) o1, (Integer) o2);
}else if (o1 instanceof Long) { //Long
return compareAsc( (Long) o1, (Long) o2);
}else {
System.err.println("未找到合适的比较器"); //找不到
return 0;
}
}
/**
* 自动寻找合适的降序序序选择器
* @param o1
* @param o2
* @return
*/
public static int compareDesc(Object o1,Object o2){
if (o1 instanceof String) { //字符串
return compareDesc( (String) o1, (String) o2);
}else if (o1 instanceof Integer) { //Integer
return compareDesc( (Integer) o1, (Integer) o2);
}else if (o1 instanceof Long) { //Integer
return compareDesc( (Long) o1, (Long) o2);
}else {
System.err.println("未找到合适的比较器"); //找不到
return 1;
}
} /**
* 升序比较字符串
* @param s1
* @param s2
* @return
*/
public static int compareAscs(String s1, String s2){
int result = 0;
if(StringUtils.isBlank(s1)){
result = 1;
}else if(StringUtils.isBlank(s2)){
result = -1;
}else{
result = s1.compareTo(s2);
}
return result;
} /**
* 降序比较字符串
* @param s1
* @param s2
* @return
*/
public static int compareDescs(String s1, String s2){
int result = 0;
if(StringUtils.isBlank(s1)){
result = 1;
}else if(StringUtils.isBlank(s2)){
result = -1;
}else{
result = s2.compareTo(s1);
}
return result;
} /**
* 升序比较数值
* @param s1
* @param s2
* @return
*/
public static int compareAsc(Integer s1, Integer s2){
int result = 0;
if(s1 <= 0){
result = 1;
}else if(s2 <= 0){
result = -1;
}else{
result = s1.compareTo(s2);
}
return result;
} /**
* 降序比较数值
* @param s1
* @param s2
* @return
*/
public static int compareDesc(Long s1, Long s2){
int result = 0;
if(s1 <= 0){
result = 1;
}else if(s2 <= 0){
result = -1;
}else{
result = s2.compareTo(s1);
}
return result;
}
/**
* 升序比较数值
* @param s1
* @param s2
* @return
*/
public static int compareAsc(Long s1, Long s2){
int result = 0;
if(s1 <= 0){
result = 1;
}else if(s2 <= 0){
result = -1;
}else{
result = s1.compareTo(s2);
}
return result;
} /**
* 降序比较数值
* @param s1
* @param s2
* @return
*/
public static int compareDesc(Integer s1, Integer s2){
int result = 0;
if(s1 <= 0){
result = 1;
}else if(s2 <= 0){
result = -1;
}else{
result = s2.compareTo(s1);
}
return result;
} /**
* get属性
* @param field
* @return
*/
public static String field2MethodName(String field){
StringBuffer method = null;
if(StringUtils.isNotBlank(field)){
method = new StringBuffer();
method.append("get");
method.append(field.substring(0,1).toUpperCase());
method.append(field.substring(1));
return method.toString();
}else
return null;
} /**
* 通过属性得到属性值,使用反射的方式,只要该类有set&get方法,即可通过反射获得该属性
* @param o
* @param field
* @return
*/
public static Object getFieldByReflect(Object o,String field){
Object oo = null;
Class<?> clazz = o.getClass();
String methodName = field2MethodName(field);
if(clazz != null && methodName != null){
try {
Method method = clazz.getMethod(methodName);
oo = method.invoke(o);
} catch (Exception e) {
e.printStackTrace();
}
}
return oo;
} /**
* 升序比较汉字字符串
* @param s1
* @param s2
* @return
*/
public static int compareAsc(String s1, String s2){
int result = 0;
if(StringUtils.isBlank(s1)){
result = 1;
}else if(StringUtils.isBlank(s2)){
result = -1;
}else{
result = Collator.getInstance(java.util.Locale.CHINA).compare(s1, s2);
}
return result;
}
/**
* 降序比较汉字字符串
* @param s1
* @param s2
* @return
*/
public static int compareDesc(String s1, String s2){
int result = 0;
if(StringUtils.isBlank(s1)){
result = 1;
}else if(StringUtils.isBlank(s2)){
result = -1;
}else{
result = -Collator.getInstance(java.util.Locale.CHINA).compare(s1, s2);
}
return result;
} }

  6. User类

 package com.test.order;

 import java.io.Serializable;

 public class User implements Serializable{

     @Override
public String toString() {
StringBuffer bf = new StringBuffer();
bf.append("User[:");
bf.append("userName:"+userName);
bf.append("\nuserPassword:"+userPassword);
bf.append("\nage:"+age+"]");
return bf.toString();
} private static final long serialVersionUID = 2764373816508835680L;
private Integer id;
private String userName;
private String userPassword;
private int age;
private String email;
private String address; public User(Integer id, String userName, String userPassword, int age,
String email, String address) {
super();
this.id = id;
this.userName = userName;
this.userPassword = userPassword;
this.age = age;
this.email = email;
this.address = address;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} public final static String ID = "id";
public final static String USERNAME = "userName";
public final static String USERPASSWORD = "userPassword";
public final static String AGE = "age";
public final static String EMAIL= "email";
public final static String ADDRESS = "address"; }

  7. 倆作用不大的小工具

    7.1 TableHeaderButton(作用:表头图标样式)

 package com.test.order;

 import javax.swing.BorderFactory;

 public class TableHeaderButton extends JButton{

     public TableHeaderButton(){
setRolloverEnabled(true);
setRequestFocusEnabled(false);
setBorder(BorderFactory.createRaisedBevelBorder());
setOpaque(true);
setContentAreaFilled(false);
setFocusable(false);
setHorizontalAlignment(JLabel.CENTER);
setHorizontalTextPosition(SwingConstants.LEFT);
setIconTextGap(5);
} }

    7.2  Constant (升降序常量:1升序,-1降序)

 package com.test.order.orderutil;

 public class Constant {
public static final String ASC = "1";
public static final String DESC = "-1"; }

三、项目链接:

1. 本人QQ,1220817583

2. CSDN链接:http://download.csdn.net/detail/qq_31790075/9720827

Jtable 表格按多列排序(支持中文汉字排序)的更多相关文章

  1. POI自动调整列宽支持中文

    /** * @Description:表格自适应宽度(中文支持) * @Author: * @param sheet sheet * @param columnLength 列数 */ private ...

  2. java中对List<Map<String,Object>>中的中文汉字排序

    import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.C ...

  3. sqlalchemy & python & datatables & javascript 中文拼音排序

    近期有中文拼单排序需要,查询资料,mysql数据库有convert函数支持 select cname from channel order by convert(cname using gbk); # ...

  4. Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序

    发布时间:2018-11-16   技术:Android   概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排 ...

  5. Bootstrap:Bootstrap_table第一篇:快速用bootstrap_table(支持参数)筛选并展示数据,固定表格前几列,实现表格单元格编辑

    1.准备好css和js文件 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstr ...

  6. JS对表格排序(支持对序号,数字,字母,日期)

    JS对表格排序(支持对序号,数字,字母,日期) 前不久看到淘宝组件有"对表格排序的插件" 如想要看 可以看这个地址 http://gallery.kissyui.com/KSort ...

  7. MySQL为什么不支持中文排序?

    前言 或许都知道,MySQL不支持中文排序,这样的说法可以说对也可以说也不对.接下来我们分析一下: 首先执行命令,查看编码集: SHOW VARIABLES LIKE 'character_set%' ...

  8. 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

    在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...

  9. bootstrap table表格属性、列属性、事件、方法

    留存一份,原文地址http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 表格参数 表格的参数定义在 jQuery.fn.bootst ...

随机推荐

  1. disconf搭建

    简介: Distributed Configuration Management Platform(分布式配置管理平台) 它是百度的一套完整的基于zookeeper的分布式配置统一解决方案,具有如下特 ...

  2. 为什么使用Junit Test而不用普通java main方法来完成测试?

    因为在程序里边,一个接口对应一个实现方法,而在接口中常常会定义相关的很多方法,所以在测试的时候,如果都在main方法里边进行测试,main方法就会显得臃肿,而且不便于以后其他人测试以及查看测试数据,用 ...

  3. 按行读取TXT文件中的内容

    public Dictionary<int, string> GetDicFromLog() { try { StreamReader sr = new StreamReader(file ...

  4. sql server报:名称 不是有效的标识符

    可能出现的几种情况: 1.执行sql提示 名称***不是有效的标识符 --添加括号 sql exec(sql) 注意exec的时候要到括号 exec  (@sql) 2.sql中的单引号嵌套采用两个单 ...

  5. 安装VS2015历险记

    最近,因为一些需求,需要在家里的笔记本上安装VS2015.本来以为一件很容易的一件事,发现做起来遇到了很多坑. 首先,下载VS2015,这就花费了两三个小时,安装包太大了.下载完,安装.安装不成功,报 ...

  6. EditView 输入限制(软键盘限制)

    众所周知EditView有个inputType 属性可以设置输入的类型. 如下设置,则只能输入数字: android:inputType="number" 但是有时候需要自定义输入 ...

  7. javascript 框架、根基技巧、布局、CSS、控件 JavaScript 类库

    预筹备之 JavaScript 今朝支流的 JavaScript 框架排名中,jQuery 和 Ext 可算是佼佼者,得到了用户的普遍好评.海内的一些框架许多也是模仿 jQuery 对 JavaScr ...

  8. Delphi的Trim函数

    三个Trim函数简介 函数原型 function Trim(const S: string): string; 将字符串前后的空白及控制字元清掉. 注意Trim函数只能清掉字符串前后的空格及控制字元, ...

  9. 爬虫requests模块 2

    会话对象¶ 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所 ...

  10. 【协议分析】Wireshark 过滤表达式实例

    Wireshark 过滤表达式实例   1.wireshark基本的语法 字符 \d          0-9的数字 \D          \d的补集(以所以字符为全集,下同),即所有非数字的字符 ...