JTable 单元格未在单击输入时更新

JTable Cell Isn't Updated On Enter Click

我有一个应用程序有一些数据的 JTable.. 所以我添加了数据并且它看起来很好.. 但是当我尝试编辑一个单元格时,我可以编辑它但是当我单击 enter 或 tab 以保存它之前反映的新内容。我不知道为什么会这样。我在网上搜索但没有希望。:(

这是 Table 模型 class :

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;
}


}

问题是:我是否需要添加任何自定义方法或代码来执行我提到的操作?

我希望您可以使用自定义 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 方法可以 return 行索引。

此外,在您的 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 的来源,我需要猜测它的数据类型和功能

but when I click enter or tab to save the new content it reflects as it was earlier..

您的 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);
}