2013-04-30 4 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 в качестве базового класса. Таким образом вам не понадобится так много методов. Поскольку вы только что начали обрабатывать все необходимые события. Если вы хотите это сделать, скопируйте этот код из «AbstractTableModel», используя либо источник Oracle/Sun, либо какой-либо другой источник. Вот некоторые источники для некоторой версии, которая даст вам и о том, сколько коде есть для обработки событий: 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

+0

Это намного чище, когда обработка событий не в вашем коде. Попробуйте идею о классе данных, который я помещаю в первую строку, если вы действительно хотите пойти этим путем. –

+0

Я действительно не обрабатываю события в своем коде, не так ли? Я управляю только слушателями ... Ваше усмотрение работает отлично, спасибо большое! :) – Sventimir