JTable行分类器 - IllegalArgumentException:无效的SortKey

时间:2013-05-23 23:53:40

标签: java swing jtable illegalargumentexception tablerowsorter

有人可以帮我吗? 它一直在工作,直到我改变了一些试图优化它的东西......该死的!

这是我的桌子型号:

class MyTableModel extends DefaultTableModel {

        private String[] columnNames = {"Last Name","First Name","Next Visit"};     //column header labels
        Object[][] data = new Object[100][3];

        public void reloadJTable(List<Customer> list) {
            for(int i=0; i< list.size(); i++){
                data[i][0] = list.get(i).getLastName();
                data[i][1] = list.get(i).getFirstName();
                if (list.get(i).getNextVisit()==null) {
                    data[i][2] = "NOT SET";
                } else {
                    String date = displayDateFormat.format(list.get(i).getNextVisit().getTime());
                    data[i][2] = date;
                }
                model.addRow(data);
            }
        }

        public void clearJTable() {
            model.setRowCount(0);
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
        */ 
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }
    }

这就是我实现JTable的方式:

// these declarations are all private shared across the model
JTable customerTbl;
MyTableModel model;
List<Customer> customers = new ArrayList<Customer>(); 
SimpleDateFormat displayDateFormat = new SimpleDateFormat ("EEE dd-MM-yyyy 'at' hh:mm");

//JTable configuration
model = new MyTableModel();
customerTbl = new JTable(model);
model.reloadJTable(customers);
customerTbl.setAutoCreateRowSorter(true);  //enable row sorters                     

DefaultRowSorter sorter = ((DefaultRowSorter)customerTbl.getRowSorter());  //default sort by Last Name
ArrayList list = new ArrayList();
list.add( new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(list);  //EXCEPTION HERE
sorter.sort();

customerTbl.getColumnModel().getColumn(0).setPreferredWidth(100);   //set Last Name column preferred width
customerTbl.getColumnModel().getColumn(1).setPreferredWidth(80);    //set First Name column preferred width
customerTbl.getColumnModel().getColumn(2).setPreferredWidth(150);   //set Last Visit column preferred width   

我正在触发以下异常:

sorter.setSortKeys(列表);

Exception in thread "main" java.lang.IllegalArgumentException: Invalid SortKey
    at javax.swing.DefaultRowSorter.setSortKeys(Unknown Source)
    at com.vetapp.customer.CustomersGUI.<init>(CustomersGUI.java:128)
    at com.vetapp.main.VetApp.main(VetApp.java:31)

我认为它与未正确创建的TableColumnModel有关...

1 个答案:

答案 0 :(得分:3)

主要问题是列数从0超类TableModel's返回DefaultTableModel。您需要覆盖此方法

@Override
public int getColumnCount() {
   return columnNames.length;
}

另一方但可能致命的问题是getColumnClass正在返回TableModel中的元素类。如果表为空,这将抛出NullPointerException。请使用类文字,例如String.class

DefaultTableModel不需要维护单独的后备数据阵列。它已经拥有自己的数据向量。在扩展AbstractTableModel时使用此方法。