Java TableModel实现使程序崩溃

时间:2013-04-30 22:44:14

标签: java swing interface jtable tablemodel

在我的程序中,我希望在JTable中显示一些数据。我有一个包含数据的类,因此在JTable中呈现它的最简单方法似乎是扩展我的类,以便它实现TableModel接口并将其用作JTable的模型。不幸的是,它对我不起作用。当程序即将绘制JTable时,会在NullPointerException处抛出javax.swing.JTable.prepareRenderer()。为什么呢?

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);
...

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

也许您的问题是getColumnClass()返回null而不是Object.class

使用AbstractTableModel作为基类。这样你就不需要那么多方法了。因为它刚刚开始处理所需的所有事件。如果您想这样做,请使用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;
    }

}