Question

I've been working on this code for couple of days. My procedure on the database works fine but it doesn't fill into the table. I'm going through the code again and again but I can't find what's wrong... The error I get is: JavaNullPointerException and the line involving is the piece of code that returns notes.length. Here's a piece of my code:

private Object[][] notes = null;
setUpStatusColumn(noteTable, noteTable.getColumnModel().getColumn(2));

protected JTable createTable(GradesModel gradesModel) {
        return new JTable(gradesModel);
    }

    public void setUpStatusColumn(JTable table, TableColumn statusColumn) {

        statusCombo = new JComboBox();
        statusCombo.addItem("OTOCLOSED");
        statusCombo.addItem("INPROGRESS");
        statusCombo.addItem("OPEN");
        statusCombo.addItem("CLOSED");
        statusColumn.setCellEditor(new DefaultCellEditor(statusCombo));

        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setToolTipText("Click to select Note Status");
        statusColumn.setCellRenderer(renderer);

    }

private class GradesModel extends AbstractTableModel {

        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

            notes[rowIndex][columnIndex] = aValue;
            fireTableCellUpdated(rowIndex, columnIndex);
        }

        public void addTableModelListener(TableModelListener l) {
        }

        public void removeTableModelListener(TableModelListener l) {
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            if (columnIndex == 0 || columnIndex == 1 || columnIndex == 4 || columnIndex == 5)
                return false;
            else
                return true;

        }

        public Class<?> getColumnClass(int col) {
            switch (col) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                return String.class;
            }

            throw new AssertionError("invalid column");
        }

        public int getRowCount() {
            return notes.length;
        }

        public int getColumnCount() {
            return 6;
        }

        public String getColumnName(int col) {
            switch (col) {
            case 0:
                return "ETT Date";
            case 1:
                return "Control Name";
            case 2:
                return "Note Status Type";
            case 3:
                return "Note Log Desc";
            case 4:
                return "Note Log Date Time";
            case 5:
                return "Update/Insert";
            }

            throw new AssertionError("invalid column");
        }

        public Object getValueAt(int row, int col) {

            for (int i = 0; i < 6; i++) {
                if (col == i)
                    return notes[row][col];
            }

            throw new AssertionError("invalid column");
        }


    }

public void getTableData() throws Exception {
        Vector<AlarmLog> alarmLog = null;
        alarmLog = RepositoryHandler.getGlobalRepository().getAlarmLog(
                alarmId);

        notes = new Object[alarmLog.size() ][5];
        java.util.Iterator<AlarmLog> ite = alarmLog.iterator();
        int i = 0;

        GradesModel myModel=(GradesModel)noteTable.getModel();

        while(ite.hasNext()){
            AlarmLog aLog = ite.next();
            myModel.setValueAt(aLog.getEttDate(), i, 0);
            myModel.setValueAt(aLog.getControlName(), i, 1);
            myModel.setValueAt(aLog.getAlarmStatusType(), i, 2);
            myModel.setValueAt(aLog.getAlarmLogDesc(), i, 3);
            myModel.setValueAt(aLog.getAlarmLogDateTime(), i, 4);
            myModel.setValueAt(1, i, 5);
            i++;
        }           
        // fill table code
        noteTable.repaint();

        //setModel

    }
public void getDataFromTable() {
        int columnCount = noteTable.getModel().getColumnCount();
        int rowCount = noteTable.getModel().getRowCount();
        Object[][] objArray = new Object[rowCount][columnCount];
        for (int i = 0; i < rowCount; i++) {
            for (int j = 0; j < columnCount; j++) {
                objArray[i][j] = noteTable.getModel().getValueAt(i, j);
            }
        }
    }
Was it helpful?

Solution

you miss method setValueAt() for adding new data to JTable, that should be but rapidly modified your method public void getTableData() throws Exception {

1) don't run hard and long code on EDT, because Swing GUI waiting for all methods done

2) I'd sugest to use DefaultTableModel instead..., then you forgot about override methods inside AbstractTableModel

3) your AbstractTableModel must contains proper fireXxxXxx methods instead of noteTable.repaint();

4) I see there another..., but by using DefaultTableModel you can't never to solve that, because these methods are implemented by default

5) I'm afraid that you re-create JTable with its model on runtime

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top