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(リスト);

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

主な問題は、列数がスーパー クラス0から返されることです。このメソッドをオーバーライドする必要がありますTableModel'sDefaultTableModel

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

getColumnClass別の側面ですが、潜在的に致命的な問題は、が 内の要素のクラスを返すという事実ですTableModelNullPointerExceptionこれは、テーブルが空の場合にスローします。などの代わりにクラス リテラルを使用しString.classます。

では、別のバッキング データ配列を維持する必要はありませんDefaultTableModel。独自のデータ ベクトルが既にあります。このアプローチは、 を拡張するときに使用されAbstractTableModelます。

于 2013-05-24T00:39:28.570 に答える