I want to design this JTable.
The goal is the user to be able to edit the cells by double clicking on them. Any changes should be able to be saved and stored on a database later.
My code is the following:
public class BirthGUI extends JFrame implements TableModelListener {
//..//
//-------------------- BIRTH TABLE --------------------
table = new JTable();
table.setModel(myModel);
myModel.reloadBirthJTable();
table.getColumnModel().getColumn(0).setPreferredWidth(100);
table.getColumnModel().getColumn(1).setPreferredWidth(80);
table.getColumnModel().getColumn(2).setPreferredWidth(115);
table.setRowHeight(20);
JScrollPane scroller = new JScrollPane(table );
table.setBounds(49, 85, 295, 374);
table.getModel().addTableModelListener(this);
panel.add(scroller,BorderLayout.CENTER);
@Override
public void tableChanged(TableModelEvent e) {
System.out.println("TableModelEvent triggered!");
int row = e.getFirstRow();
int column = e.getColumn();
Object test = myModel.getValueAt(row, column);
System.out.println("row: " + row + " column: " + column);
System.out.println(test.toString());
}
and my TableModel:
public class BirthTableModel extends DefaultTableModel {
private String[] columnNames = {"Date", "Children", "Complications/Comments"}; //column header labels
private Object[][] data = new Object[20][3];
private List<Birth> list;
public void reloadBirthJTable() {
System.out.println("loading birth table..");
for(int i=0; i<20; i++){
data[i][0] = "";
data[i][1] = "";
data[i][2] = "";
this.addRow(data);
}
}
public void clearJTable() {
this.setRowCount(0);
}
@Override
public void addRow(Object[] arg0) {
// TODO Auto-generated method stub
super.addRow(arg0);
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
for(int rowIndex = 0; rowIndex < getRowCount(); rowIndex++) {
Object[] row = data[rowIndex];
if (row[c] != null) {
return getValueAt(rowIndex, c).getClass();
}
}
return String.class;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
}
The problem is that while the cells are editable after I double click on them and the tableChanged() is triggered, any change I make to them is deleted as soon the cell loses focus...
My output while modifying cells is this:
loading birth table..
TableModelEvent triggered!
row: 1 column: 0
TableModelEvent triggered!
row: 0 column: 0
so test
seems to be empty..