2013-04-30 74 views
0

在我的程序中,我希望在JTable中顯示一些數據。我有一個包含數據的類,因此將其呈現在JTable中的最簡單的方法似乎擴展了我的類,以便它實現TableModel接口並將其用作JTable的模型。不幸的是,它不適合我。當該程序即將繪製JTable時,NullPointerException引發到javax.swing.JTable.prepareRenderer()。爲什麼?Java TableModel實現崩潰程序

package bridgecalc; 

import java.util.HashSet; 

import javax.swing.event.TableModelListener; 
import javax.swing.table.TableModel; 

public class MyTableModel extends MyDataClass implements TableModel { 

    private static final long serialVersionUID = 1L; 
    // private Object[][] data; //this is in fact declared in the superclass 
    private static final String[] colNames = {"bla", "blabla", "hola", "hej", "egle", "begle", "eciepecie"}; 
    private HashSet<TableModelListener> listeners; 

    public MyTableModel() { 
     data = new Object[7][7]; 
     listeners = new HashSet<TableModelListener>(); 
    } 

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

    @Override 
    public int getRowCount() { 
     return data[0].length; 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     return data[arg0][arg1]; 
    } 

    @Override 
    public void addTableModelListener(TableModelListener l) { 
     listeners.add(l); 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     return null; 
    } 

    @Override 
    public String getColumnName(int columnIndex) { 
     return colNames[columnIndex]; 
    } 

    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     if (rowIndex == columnIndex) 
      return false; 
     else return true; 
    } 

    @Override 
    public void removeTableModelListener(TableModelListener l) {   
     listeners.remove(l); 
    } 

    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     data[columnIndex][rowIndex] = aValue; 
    } 

} 

並在程序的某個地方:

... 
JTable table = new JTable(new MyTableModel()); 
this.setViewportView(table); 
... 

預先感謝任何幫助。

回答

2

也許你的問題是getColumnClass()返回,而不是Object.class

使用AbstractTableModel上null作爲基類。這樣你就不需要太多的方法。就像你剛開始處理所有需要的事件一樣。如果您想這樣做,請使用Oracle/Sun源代碼或其他來源從「AbstractTableModel」中複製該代碼。下面是一些來源的一些版本,會給你和有多少代碼來處理事件的想法:Java Source for AbstractTableModel

public class MyTableModel extends AbstractTableModle { 

private MyDataClass myData; // holds the cell data 

private static final String[] colNames = {"bla", "blabla", "hola", "hej", "egle", "begle", "eciepecie"}; 

public MyTableModel(MyDataClass val) { 
    myData = val; 
    myData.data = new Object[7][7]; 
} 

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

@Override 
public int getRowCount() { 
    return myData.data[0].length; 
} 

@Override 
public Object getValueAt(int arg0, int arg1) { 
    return myData.data[arg0][arg1]; 
} 

@Override 
public String getColumnName(int columnIndex) { 
    return colNames[columnIndex]; 
} 

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    if (rowIndex == columnIndex) 
     return false; 
    else return true; 
} 

@Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     myData.data[columnIndex][rowIndex] = aValue; 
    } 

} 
+0

感謝您的關注。我考慮過。我決定實現'TableModel'而不是有意地擴展'AbstractTableModel'。 MyDataClass對於我的數據來說是一個方便的conatainer,它只需要一些輔助方法。擴展'AbstractTableModel'會迫使我重寫很多沒有purpouse的代碼... – Sventimir 2013-04-30 22:56:44

+0

當事件處理不在你的代碼中時,它會更清晰。如果你真的想這樣做,試試關於我放在第一行的數據類的想法。 – 2013-04-30 22:58:29

+0

我真的沒有在我的代碼中處理事件,是嗎?我只管理聽衆... 你的溶劑很好,非常感謝! :) – Sventimir 2013-04-30 23:02:13