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