加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么我的JTable不正确地排序整数列?

发布时间:2020-12-14 16:38:34 所属栏目:Java 来源:网络整理
导读:我有一个使用DefaultTableModel的JTable,当用户点击列标题时,我允许进行排序.但是,当用户单击具有整数类型数据的列的标题时,它不能正确排序.看起来它是通过String排序而不是整型类型. 这里是我的代码实际添加到表中的部分: DefaultTableModel aModel = (Def
我有一个使用DefaultTableModel的JTable,当用户点击列标题时,我允许进行排序.但是,当用户单击具有整数类型数据的列的标题时,它不能正确排序.看起来它是通过String排序而不是整型类型.

这里是我的代码实际添加到表中的部分:

DefaultTableModel aModel = (DefaultTableModel) mainView.logEntryTable.getModel();
                    ResultSetMetaData rsmd;             try {
            mainView.logEntriesTableModel.setRowCount(0);
            rsmd = rs.getMetaData();

            int colNo = rsmd.getColumnCount();
            while(rs.next()){
                Object[] objects = new Object[colNo];
                for(int i=0;i<colNo;i++){
                    objects[i]=rs.getObject(i+1);
                }
                aModel.addRow(objects);
                count++;
            }
            mainView.logEntryTable.setModel(aModel);
            mainView.logEntryTable.getColumnModel().getColumn(0).setMaxWidth(80);

所以我试图重写这个方法,最终结束了:

@Override
            public Class<?> getColumnClass(int columnIndex){
                if( columnIndex == 0){
                    // Return the column class for the integer column
                }else{
                    // Return the column class like we normally would have if we didn't override this method
                }

                return null;
            }
        };

我从来没有超过这个,我不太清楚我期望在这里做什么.

解决方法

尝试这个小例子.

更好的方法

如Kleopatra所建议的,定义与每个列相关的列类将足以使数据被正确排序.

import javax.swing.*;
import javax.swing.table.*;
import java.util.Comparator;

class TableSorting {
    public static void main(String[] args) {
        Object[][] data = {
            {new Integer(1),"Don't Let Go",new Integer(179)},{new Integer(2),"Photograph",new Integer(29)},{new Integer(3),"Hash Pipe",new Integer(186)},{new Integer(4),"Island In The Sun",new Integer(200)},{new Integer(5),"Crab",new Integer(154)},{new Integer(6),"Knock-Down Drag-Out",new Integer(128)},{new Integer(7),"Smile",new Integer(158)},{new Integer(8),"Simple Pages",new Integer(176)},{new Integer(9),"Glorious Day",new Integer(160)},{new Integer(10),"O Girlfriend",new Integer(230)}
        };
        Object[] columns = {"Track #","Title","Length"};
        DefaultTableModel model = new DefaultTableModel(data,columns) {
            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return Integer.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Integer.class;
                    default:
                        return String.class;
                }
            }
        };
        JTable table = new JTable(model);
        JScrollPane scroll = new JScrollPane(table);
        table.setAutoCreateRowSorter(true);
        JOptionPane.showMessageDialog(null,scroll);
    }
}

原来,用比较器

import javax.swing.*;
import javax.swing.table.*;
import java.util.Comparator;

class TableSorting {
    public static void main(String[] args) {
        Object[][] data = {
            {new Integer(1),"Length"};
        JTable table = new JTable(data,columns);
        JScrollPane scroll = new JScrollPane(table);
        DefaultTableModel model = new DefaultTableModel(data,columns);
        TableRowSorter trs = new TableRowSorter(model);

        class IntComparator implements Comparator {
            public int compare(Object o1,Object o2) {
                Integer int1 = (Integer)o1;
                Integer int2 = (Integer)o2;
                return int1.compareTo(int2);
            }

            public boolean equals(Object o2) {
                return this.equals(o2);
            }
        }

        trs.setComparator(0,new IntComparator());

        table.setRowSorter(trs);

        scroll = new JScrollPane(table);
        table.setAutoCreateRowSorter(false);
        JOptionPane.showMessageDialog(null,scroll);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读