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!
The GUI editor creates a
DefaultTableModelfor you by default, but you can pry the model loose from the generated code by specifyingCustom codefor the relevant property, as shown here. Once you have control of the model, you can overrideisCellEditable()as required or as shown here.