Jtable content will not be updated after adding data as parameter

I have jtable, everything works fine if I set the table data as a public variable (do not put it on the tablemodel parameter). But now I need to set the table data as a parameter, and the table will not update its contents. I print out some cell value and line number, they are updated and fixed. Just the display does not change, the contents are still old. I tried all types of methods for updating the table, including fireTableDataChanged and redrawing, as well as other fire functions, none of them work. Please help. Many thanks!!!!!!

table model:

       public class MyTableModel extends AbstractTableModel {

           protected String[] columnNames;
           private String[][] data;


            public MyTableModel(String[] columnNames, String[][] data){
                this.columnNames = columnNames;
                this.data = data;
                //I add this here but it still doesn't refresh the table
                fireTableDataChanged();
            }

            public int getColumnCount() {
                return columnNames.length;
            }

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

            public String getColumnName(int col) {
                return columnNames[col];
            }

            public String getValueAt(int row, int col) {
                return data[row][col];                  
            }

           public void setData(String[][] newdata) {   
              data = newdata;

              fireTableDataChanged();   
              }  
        }

Code updating model and table table:

        tableModel=new MyTableModel(columnNames, data);
        tableModel.fireTableDataChanged();
        table = new JTable();
        table.setModel(tableModel); 
        ((AbstractTableModel) table.getModel()).fireTableDataChanged();
        //outputs showed the content is updated
        System.out.println("total row count" + table.getRowCount());
        System.out.println("cell info" + table.getValueAt(0,5));


        table.repaint();
        feedback.repaint();
        this.repaint();
+3
2

:

 tableModel=new MyTableModel(columnNames, data);
 tableModel.fireTableDataChanged(); // not necessary
 table = new JTable(); // dont do this, you are removing your handle to the table in your view
 table.setModel(tableModel); 
+8

, . OOPS .

/******************Its a custom class for creating custom editors so plz comment unwanted code ********************************/

@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel 
{
    protected String[] columnNames = {"URL",
                                    "Category",
                                    "Select"};
    protected static Object data [][] = null;

    public MyTableModel() { 
     }

    public final Object[] longValues = {"http://www.oracle.com", "BOOK", Boolean.TRUE};

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {

        if(data !=null)
            return data.length;
        else
            return 0;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {

        if(data!=null)
            return data[row][col];
        else
            return null;
    }

    /*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text ("true"/"false"),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col < 0) {
            return false;
        } else {
            return true;
        }
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
    public void setValueAt(Object value, int row, int col) 
    {

        data[row][col] = value;
        fireTableCellUpdated(row, col);
        // printDebugData();
    }

    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();

        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}

/***********************************/
//Use a Jbutton add a listener and put this code in it to test it works !!

Object d [][] = {
                {"http://www.abc.com", "ABC", new Boolean(false)},
                {"http://www.google.com", "DEF", new Boolean(true)},
                {"http://www.yahoo.com", "FGH", new Boolean(false)},
                {"http://www.google.com", "IJK", new Boolean(true)},
                {"http://www.yahoo.com", "LMN", new Boolean(false)}
            };

        model.data = d; //Important to update data
        model.fireTableDataChanged(); //Important to make changes reflected.
/*********************************************/
+1

Source: https://habr.com/ru/post/1734574/


All Articles