JTable Cell未在Enter Enter上更新

时间:2015-04-08 22:19:15

标签: java swing jtable abstracttablemodel

我有一个应用程序,它有一些数据的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;
}


}

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

2 个答案:

答案 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);
}