2013-04-30 120 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