この 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());
}
そして私の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;
}
}
問題は、セルをダブルクリックして tableChanged() がトリガーされた後、セルは編集可能ですが、セルに加えた変更はセルがフォーカスを失うとすぐに削除されることです...
セルを変更するときの私の出力は次のとおりです。
loading birth table..
TableModelEvent triggered!
row: 1 column: 0
TableModelEvent triggered!
row: 0 column: 0
test
空いているようです..