Question

I use a AbstractTableModel for my JTable.

public class MyTableModel extends AbstractTableModel {

     private List<String> columnNames = new ArrayList<String>();
     private List<List> data = new ArrayList();

     MyTableModel() {
          columnNames.add("Action");
          columnNames.add("Count");
          columnNames.add("Total");
          columnNames.add("X");
          columnNames.add("Y");
          columnNames.add("Quarter");
          columnNames.add("Answer");
          columnNames.add("T (ms)");
     }

     public void addRow(List rowData) {
          data.add(rowData);
          fireTableRowsInserted(data.size() - 1, data.size() - 1);
     }

     public void insertRow(int index, List rowData) {
          data.add(0, rowData);
          fireTableRowsInserted(data.size() - 1, data.size() - 1);
     }

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

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

     public String getColumnName(int col) {
          try {
               return columnNames.get(col);
          } catch (Exception e) {
               return null;
          }
     }

     public Object getValueAt(int row, int col) {
          return data.get(row).get(col);
     }


     public boolean isCellEditable(int row, int col) {
          return false;
     }

     public Class getColumnClass(int c) {
          return getValueAt(0, c).getClass();
     }     
}

I add to it (with success) new rows while application is running by execute some code in a some not important class. It looks like this.

MyClass.MyTableModel.insertRow(0, (Arrays.asList(String.valueOf(valueOne), String.valueOf(valueTwo), String.valueOf(valueThree), 
                    String.valueOf(valueFour), String.valueOf(valueFive), String.valueOf(valueSix), String.valueOf(valueSeven), 
                    String.valueOf(valueEight), String.valueOf(valueNine))));
MyClass.myTable.setModel(MyClass.MyTableModel);
MyClass.myTable.repaint();

But I can't change data in specific cells in such added rows. I tried to cover a setValueAt() method, but with no success. Also I tried to simply call method setValueAt() for MyClass.MyTableModel for example:

MyClass.MyTableModel.setValueAt("valueChange", 0, 6);
MyClass.myTable.setModel(MyTableModel);
MyClass.myTable.repaint();

That also doesn't work. I tried to call fireTableCellUpdated() for my model (i know it's wrong practice), but it also failed in attempt. Do you have any ideas?

Was it helpful?

Solution

You don't override the setValueAt method. By default, this method does nothing.

For example...

public void setValueAt(Object value, int row, int column) {
    List rowValues = date.get(row);
    rowValues.set(column, value);
    fireTableCellUpdated(row, col);
}

This assumes that all the columns are editable. Normally I would inspect the incoming value to ensure it was the correct type for the specified column and apply what ever validation might need to be done, but I'll leave that up to you

You might also like to take a look at How to use tables which as a few examples

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