I have created a jTable on an UI, where I want to change a cell attribute from editable to not editable according to other cell's boolean state (checkbox). I've been looking through several examples but failed to do what intended mainly because I made the mistake of creating the UI with NetBeans thus creating ton's of code which I can't even edit.
My Table: table http://freepicupload.com/images/337jtable1.png!
EDIT: FIXED, working, code below.
Code generating the table/model:
jTable1.setModel(new MyTableModel());
Table Model and the logic implemented:
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Job Type",
"Name",
"avg Time",
"Buffer",
"Buffer Parts",
"Color"};
private Object[][] data = {
{"1", "Station 1",
new Integer(10), new Boolean(false), new Integer(0), Color.red},
{"2", "Station 2",
new Integer(10), new Boolean(false), new Integer(0), Color.blue},
{"3", "Station 3",
new Integer(10), new Boolean(false), new Integer(0), Color.green},
{"4", "Station 4",
new Integer(10), new Boolean(false), new Integer(0), Color.orange},
{"5", "Station 5",
new Integer(10), new Boolean(false), new Integer(0), Color.black}
};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
/*
* 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.
*/
@Override
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 if (col == 4) {
/*if (getValueAt(row,(col-1)) == "false") { System.out.println("NAO PODES EDITAR BOI"); }
else if (getValueAt(row,(col-1)) == "true") { System.out.println("Podes que eu deixo!"); } */
boolean di = (Boolean) getValueAt(row,(col-1));
if (!di) { return false; }
else { return true; }
}
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);
}
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("--------------------------");
}
}
In this case, it will only allow to edit cells on column 4 if column 3's checkbox is checked (state true). Hope it helps!