我想设计这个 JTable。
目标是用户能够通过双击单元格来编辑它们。任何更改都应该能够在以后保存并存储在数据库中。
我的代码如下:
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());
}
和我的表模型:
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;
}
}
问题是,虽然单元格在我双击它们并触发 tableChanged() 后是可编辑的,但一旦单元格失去焦点,我对它们所做的任何更改都会被删除......
我在修改单元格时的输出是这样的:
loading birth table..
TableModelEvent triggered!
row: 1 column: 0
TableModelEvent triggered!
row: 0 column: 0
所以test
好像是空的。。