I want use a class to construct a TableModel. I know how to use method return a TableModel.
But I wonder how to use class to construct a TableModel.
So far I failed. The dataset did not get all the value through data. So dataset is null. Similarly columnNamesCount also is null.
Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "this.columnNamesCount" is null
at MyTableModel.getColumnCount(castToModel.java:57)
at java.desktop/javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1297)
at java.desktop/javax.swing.JTable.tableChanged(JTable.java:4391)
at java.desktop/javax.swing.JTable.setModel(JTable.java:3693)
at java.desktop/javax.swing.JTable.<init>(JTable.java:647)
at java.desktop/javax.swing.JTable.<init>(JTable.java:588)
at castToModel.<init>(castToModel.java:14)
at Main.main(Main.java:54)
After the while loop the data is stored all the value.
class MyTableModel extends AbstractTableModel {
public Object[][] dataset;
public int columnCount;
public String[] columnNames;
public String[] columnNamesCount;
String query = "select * from emp";
void MyTableModel() throws SQLException {
Statement stmt = Main.connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
//PreparedStatement stmt = Main.connection.prepareStatement(query);
ResultSet resultSet = stmt.executeQuery(query);
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
columnCount = resultSetMetaData.getColumnCount();
columnNames = new String[columnCount];
for (int ii = 1; ii <= columnCount; ii++) {
columnNames[ii-1] = resultSetMetaData.getColumnName(ii);
}
resultSet.last();
int rowCount = resultSet.getRow();
resultSet.beforeFirst();
Object[][] data = new Object[rowCount][columnCount];
int currentRow = 0;
while (resultSet.next()) {
for (int currentColumn = 1; currentColumn <= columnCount; currentColumn++) {
data[currentRow][currentColumn - 1] = resultSet.getObject(currentColumn);
}
currentRow++;
}
dataset = data;
columnNamesCount=columnNames;
}
@Override
public int getRowCount() {return dataset.length;}
@Override
public int getColumnCount() {return columnNamesCount.length;}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {return dataset[rowIndex][columnIndex];}
public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }
public boolean isCellEditable(int row, int col) {return true;}
}
Edit1: My casttoModel code:
public class castToModel {
public castToModel(){
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableModel model = new MyTableModel();
JTable table = new JTable(model);
frame.add(table);
frame.pack();
frame.setVisible(true);}
}
From the code in your question:
This is not a constructor.
This is a constructor:
The java compiler treats
void MyTableModel()as a regular method that does not return a value and has package access. This means that classMyTableModeldoes not declare a constructor. In that case, the compiler will add an empty constructor like below:You need to remove the word
voidand replace it with the appropriate access modifier.Also, in the code in your question, you never initialize
columnNamesCount. Hence it is null and hence methodgetColumnCount()throwsNullPointerException. I think methodgetColumnCount()should be as follows: