0

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

这是我的表模型:

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(list);

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 有关...

4

1 回答 1

3

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

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

另一个可能致命的问题是getColumnClassTableModel. NullPointerException如果表是空的,这将抛出一个。使用类文字代替,例如String.class.

对于DefaultTableModel. 它已经有了自己的数据向量。扩展时使用此方法AbstractTableModel

于 2013-05-24T00:39:28.570 回答