В моей программе я хочу показать некоторые данные в 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
Это намного чище, когда обработка событий не в вашем коде. Попробуйте идею о классе данных, который я помещаю в первую строку, если вы действительно хотите пойти этим путем. –
Я действительно не обрабатываю события в своем коде, не так ли? Я управляю только слушателями ... Ваше усмотрение работает отлично, спасибо большое! :) – Sventimir