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);
...
預先感謝任何幫助。
感謝您的關注。我考慮過。我決定實現'TableModel'而不是有意地擴展'AbstractTableModel'。 MyDataClass對於我的數據來說是一個方便的conatainer,它只需要一些輔助方法。擴展'AbstractTableModel'會迫使我重寫很多沒有purpouse的代碼... – Sventimir 2013-04-30 22:56:44
當事件處理不在你的代碼中時,它會更清晰。如果你真的想這樣做,試試關於我放在第一行的數據類的想法。 – 2013-04-30 22:58:29
我真的沒有在我的代碼中處理事件,是嗎?我只管理聽衆... 你的溶劑很好,非常感謝! :) – Sventimir 2013-04-30 23:02:13