刚学JAVA不久,发现java自己封装了排序的一个类,本以为使用很方便,可是发现它返回的类型总是不太合适。现在我要将其改为int类型,太清楚具体改法,望指教。
原来的写法,只是实现排序//重写前
model = new DefaultTableModel(null, names);
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
后来上网找说是只要重写这个类中的getColumnClass就好,可现在好像有些问题了就//重写后
model = new DefaultTableModel(null, names)
 {
 public Class getColumnClass(int names) {
 Class returnValue;
 if ((names >= 0) && (names < getComponentCount())) {
 returnValue = getValueAt(0, names).getClass();
 } else {
 returnValue = Object.class;
 }
 return returnValue;
 }
 };
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
现在运行也有错误,returnValue = getValueAt(0, names).getClass();这句有错误,是改了值类型问题?而且后面像JTable填充数据时类型该怎么选?
我现在的需求就是按照每列自己的类型排序,比如有全是String类型,就还那么排;有int类型就按int排;这样是不是要重新自己写排序?监听鼠标单击事件,获得表头,确定该列内容云云的……?
望指教,谢谢

解决方案 »

  1.   

    DefaultTableModel(Object[][] data, Object[] columnNames)对data排序放进去就OK了,也可以从table里获取这个data然后排序,在从新刷新下table
      

  2.   

    可是这是初始化表呢,还不知道数据是什么,所以我才在data那里是null;那要现在就先获得表数据,但可以先不显示出来,是这个意思么?
      

  3.   

    没有数据你怎么排序呢,说下你的排序规则吧,没有实际数据,可以模拟几条数据吧,想想显示什么数据你不会不知道吧?Object[][] data 排序后 放入DefaultTableModel(Object[][] data, Object[] columnNames)里就OK了,
    问题:
    1. 你是想直接对传入的数据进行排序,还是希望点击某个header来排序?
      

  4.   

    自然是点击header排序,可能是我之前的设计问题,我现在是点击按钮后,才进行数据库连接的操作(然后获得数据,显示数据什么的);现在的情况是不是应该先把这些数据都查出来了,然后在进行操作?或者是不是就把这个排序功能加到创建表那里就好了?
      

  5.   

    先把数据拿到,然后把JTable显示出来,至于如何排序,都是后话了,你所说的2种方法都可以。不论如何都是对data操作而已。
      

  6.   

    非常谢谢你得耐心回复,可是我的问题似乎还没解决(=。= 天资略低)
    下面是我的一个测试DemoString[] names = { "aaa", "bbb", "ccc" };
    Object[][] data = { { "123", "123", "123" }, 
    { "111", "123", "123" },
    { "11", "123", "123" }, 
    { "100", "123", "123" },
    { "20", "123", "123" }, 
    { "3", "123", "123" }, 
    };
    model = new DefaultTableModel(data, names) {
    public Class getColumnClass(int names) {
    Class returnValue;
    if ((names >= 0) && (names < getComponentCount())) {
    returnValue = getValueAt(0, names).getClass();
    } else {
    returnValue = Object.class;
    }
    return returnValue;
    }
    };
    sorter = new TableRowSorter<DefaultTableModel>(model);
    tab1 = new JTable(model);
    tab1.setRowSorter(sorter);
    点击header后并没有按照int排序,第一列依旧排序不对;是不是我没有调用我重写的这个类?
      

  7.   

    public Class getColumnClass(int names) {为什么我在这地加入断点,发现程序并没有执行我这个方法?直接过了
      

  8.   


    import javax.swing.*;
    import javax.swing.table.*;import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.Dimension;public class TableExample3 {    public TableExample3() {
            JFrame frame = new JFrame("Table");
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {System.exit(0);}});        // Take the dummy data from SwingSet.
            final String[] names = {"First Name", "Last Name", "Favorite Color",
                                    "Favorite Number", "Vegetarian"};
            final Object[][] data = {
        {"Mark", "Andrews", "Red", new Integer(2), Boolean.TRUE},
        {"Tom", "Ball", "Blue", new Integer(99), Boolean.FALSE},
        {"Alan", "Chung", "Green", new Integer(838), Boolean.FALSE},
        {"Jeff", "Dinkins", "Turquois", new Integer(8), Boolean.TRUE},
        {"Amy", "Fowler", "Yellow", new Integer(3), Boolean.FALSE},
        {"Brian", "Gerhold", "Green", new Integer(0), Boolean.FALSE},
        {"James", "Gosling", "Pink", new Integer(21), Boolean.FALSE},
        {"David", "Karlton", "Red", new Integer(1), Boolean.FALSE},
        {"Dave", "Kloba", "Yellow", new Integer(14), Boolean.FALSE},
        {"Peter", "Korn", "Purple", new Integer(12), Boolean.FALSE},
        {"Phil", "Milne", "Purple", new Integer(3), Boolean.FALSE},
        {"Dave", "Moore", "Green", new Integer(88), Boolean.FALSE},
        {"Hans", "Muller", "Maroon", new Integer(5), Boolean.FALSE},
        {"Rick", "Levenson", "Blue", new Integer(2), Boolean.FALSE},
        {"Tim", "Prinzing", "Blue", new Integer(22), Boolean.FALSE},
        {"Chester", "Rose", "Black", new Integer(0), Boolean.FALSE},
        {"Ray", "Ryan", "Gray", new Integer(77), Boolean.FALSE},
        {"Georges", "Saab", "Red", new Integer(4), Boolean.FALSE},
        {"Willie", "Walker", "Phthalo Blue", new Integer(4), Boolean.FALSE},
        {"Kathy", "Walrath", "Blue", new Integer(8), Boolean.FALSE},
        {"Arnaud", "Weber", "Green", new Integer(44), Boolean.FALSE}
            };        // Create a model of the data.
            TableModel dataModel = new AbstractTableModel() {
                // These methods always need to be implemented.
                public int getColumnCount() { return names.length; }
                public int getRowCount() { return data.length;}
                public Object getValueAt(int row, int col) {return data[row][col];}            // The default implementations of these methods in
                // AbstractTableModel would work, but we can refine them.
                public String getColumnName(int column) {return names[column];}
                public Class getColumnClass(int col) {return getValueAt(0,col).getClass();}
                public boolean isCellEditable(int row, int col) {return (col==4);}
                public void setValueAt(Object aValue, int row, int column) {
                    data[row][column] = aValue;
                }
             };        // Instead of making the table display the data as it would normally with:
            // JTable tableView = new JTable(dataModel);
            // Add a sorter, by using the following three lines instead of the one above.
            TableSorter  sorter = new TableSorter(dataModel);
            JTable    tableView = new JTable(sorter);
            sorter.addMouseListenerToHeaderInTable(tableView);        JScrollPane scrollpane = new JScrollPane(tableView);        scrollpane.setPreferredSize(new Dimension(700, 300));
            frame.getContentPane().add(scrollpane);
            frame.pack();
            frame.setVisible(true);
        }    public static void main(String[] args) {
            new TableExample3();
        }
    }jdk1.5.0\demo\jfc\TableExample\src
    参考下吧