3

I am trying to make all the cells of a JTable uneditable when double clicked by the user. I have read a lot of forum posts and the general consensus is to create a new table model class, extend DefaultTableModel and then override method isCellEditable(int row, int column). I did all of this and now when I run my program (applet) Nothing shows up in the cells. NOTE I have a prof this semester that does not think applets are outdated...

Code for the table model:

public class MyTableModel extends DefaultTableModel
{
    public boolean isCellEditable(int row, int column)      //override isCellEditable
    //PRE:  row > 0, column > 0
    //POST: FCTVAL == false always
    {
        return false;
    }
}

    Code in my class:  **NOTE** this class extends JPanel 

    private JScrollPane storesPane;                
    private JTable storesTable; 

    Code in the Constructor:             

    storesTable = new JTable(tableData, COL_NAMES);    //tableData and COL_NAMES are passed in
    storesTable.setModel(new MyTableModel());

    storesPane = new JScrollPane(storesTable);
    storesTable.setFillsViewportHeight(true);
    add(storesPane, BorderLayout.CENTER);     

Hopefully some of you Java Gurus can find my error :)

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • Possible duplicate of [Java JTable - Make only one column editable](https://stackoverflow.com/questions/8167173/java-jtable-make-only-one-column-editable) – Line Aug 07 '18 at 17:06

4 Answers4

6

This line creates a new JTable and implicitly creates a DefaultTableModel behind the scenes, one that holds all the correct data needed for the JTable:

storesTable = new JTable(tableData, COL_NAMES);

And this line effectively removes the table model created implicitly above, the one that holds all of the table's data and replaces it with a table model that holds no data whatsoever:

storesTable.setModel(new MyTableModel());

You need to give your MyTableModel class a constructor and in that constructor call the super constructor and pass in the data that you're currently passing to the table in its constructor.

e.g.,

public class MyTableModel extends DefaultTableModel {

   public MyTableModel(Object[][] tableData, Object[] colNames) {
      super(tableData, colNames);
   }

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

Then you can use it like so:

MyTableModel model = new MyTableModel(tableData, COL_NAMES);
storesTable = new JTable(model);
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
3

Earlier today I had the same problem. This solved it for me.

    JTable table = new JTable( data, headers ){  
      public boolean isCellEditable(int row, int column){  
        return false;  
      }  
    };  

works great!

Jonas Borggren
  • 2,591
  • 1
  • 22
  • 40
3

Just override the isCellEditable method of the DefaultTableModel class. The quick way to do this:

JTable table = new JTable();
DefaultTableModel dtm = new DefaultTableModel(0, 0) {
    public boolean isCellEditable(int row, int column) {
        return false;
    }
};
table.setModel(dtm);
omerfarukdogan
  • 839
  • 9
  • 26
1

Hello Friend am also working on table please try my code

    import javax.swing.table.AbstractTableModel;

    public class Table extends AbstractTableModel {

    private boolean DEBUG = false;
    private String[] columnNames = {"                Date Time", "                Parameter",
    "   Barometric Pressure (hPa)", "           Temperature (°C)", "             Battery             Voltage    (V)"};

public static Object[][] data = {};


public TableControllerViewdataTabTableModel() {
}

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

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

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

@Override
public Object getValueAt(int row, int col) {
    return data[row][col];
}

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

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

}

@Override
/**
 * The setValueAt.
 */
public void setValueAt(Object value, int row, int col) {
    data[row][col] = value;
    fireTableCellUpdated(row, col);

    if (DEBUG) {

        printDebugData();
    }
}

/**
 * The printDebugData.
 */
private void printDebugData() {
    int numRows = getRowCount();
    int numCols = getColumnCount();

    for (int i = 0; i < numRows; i++) {

        for (int j = 0; j < numCols; j++) {
        }

    }

}
}
Sandeep
  • 24
  • 1
  • please override this method in you table calss @Override public boolean isCellEditable(int row, int col) { return false; } – Sandeep Jan 06 '14 at 04:11