我有一个应用程序,它有一些数据的JTable ..所以我添加数据,它看起来很好..但当我尝试编辑一个单元格,我可以编辑它,但当我点击输入或选项卡保存它反映的新内容早于...我不知道为什么会发生这种情况..我在网上搜索但没有希望...... :(
这是Table Model类:
public class TableModel extends AbstractTableModel {
String[] columnNames = { "Col1", "Col2", "Col3", "Col4", "Col5", "Col6" };
private List<Entry> db;
JTable table;
public TableModel(JTable table) {
this.table = table;
}
public void addRow(Entry entry) {
db.add(entry);
fireTableRowsInserted(db.size() - 1, db.size() - 1);
table.editCellAt(db.size() -1, 0);
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
public void setData(List<Entry> db) {
this.db = db;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public int getColumnCount() {
return 6;
}
@Override
public int getRowCount() {
return db.size();
}
@Override
public Object getValueAt(int row, int col) {
Entry entry = db.get(row);
try {
switch (col) {
case 0:
return entry.getItem();
case 1:
return entry.getTransPayment();
case 2:
return entry.getEquipPayment();
case 3:
return entry.getGasPayment();
case 4:
return entry.getEquipSparePayment();
case 5:
return entry.getTransSparePayment();
case 6:
return entry.getTotal();
}
} catch (Exception e) {
fireTableDataChanged();
}
return null;
}
}
问题是:我是否需要添加任何自定义方法或代码来执行我提到的操作?
答案 0 :(得分:2)
我希望您可以使用自定义TableCellEditor
执行此操作,但事实并非如此。
您需要为 Enter 键提供一个键绑定,这样您就可以为该键关联一个适当的操作,例如......
public class EditSelectedCellAction extends AbstractAction {
private JTable table;
public EditSelectedCellAction(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e) {
int col = table.getSelectedColumn();
int row = table.getSelectedRow();
if (col >= 0 && row >= 0) {
table.editCellAt(row, col);
}
}
}
然后,您需要将EditSelectedCellAction
绑定到 Enter 键,例如......
InputMap im = table.getInputMap(JTable.WHEN_FOCUSED);
ActionMap am = table.getActionMap();
KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
im.put(enterKey, "Action.enter");
am.put("Action.enter", new EditSelectedCellAction(table));
反馈的
从来没有任何理由为什么模型应该引用任何视图组件。该模型应该根本不在乎。模型可以与多个视图(在本例中为表格)相关联,实际上可以维护对任何视图组件的引用。
相反,调用您的addRow
方法应该做出编辑单元格的决定。也许,您的addRow
方法可以返回行索引。
另外,在你getValueAt
方法中,如果由于某种原因出现问题,你可以调用fireTableDataChanged();
,这可能会产生令人讨厌的连锁反应,这可能会使你的程序处于无限循环中并且是最好避免
<强>更新强>
首先,我知道你没有覆盖isCellEditable
,但事实证明,你没有覆盖setValueAt
@Override
public void setValueAt(Object aValue, int rowIndex, int colIndex) {
Entry entry = db.get(rowIndex);
switch (colIndex) {
case 0:
entry.getItem();
break;
case 1:
entry.setTransPayment(aValue);
break;
case 2:
entry.setEquipPayment(aValue);
break;
case 3:
entry.setGasPayment(aValue);
break;
case 4:
entry.setEquipSparePayment(aValue);
break;
case 5:
entry.setTransSparePayment(aValue);
break;
case 6:
entry.setTotal(aValue);
break;
}
fireTableCellUpdated(rowIndex, colIndex);
}
现在,因为您没有提供Entry
的来源,我需要猜测其数据类型和功能
答案 1 :(得分:2)
但是当我点击“输入”或“制表符”以保存新内容时,它会像之前一样反映出来。
您的TableModel
没有实施setValueAt(...)
方法,因此永远不会保存编辑器中的数据。
@Override
public void setValueAt(Object value, int row, int column)
{
Entry entry = db.get(row);
switch (column)
{
case 0: entry.setItem(value); break;
case 1: entry.setTransPayment(value); break;
...
}
fireTableCellUpdated(row, column);
}