场景是这样的:用户编辑一个单元格,然后按TAB键。编辑停止,值在模型中。但是,如果postUpdateTestFailed()
返回true,我想将选择移回刚刚编辑的单元格,以便用户可以进行一些修改。问题是,它不起作用。它适用于除我选择的单元格之外的其他任何东西... :(因为用户按下TAB,焦点/选定的单元格总是下一个。看起来像我的选择更改在这种特殊情况下被忽略。我做错了什么? :)
public void tableChanged(TableModelEvent tme) {
int row = tme.getFirstRow();
int col = tme.getColumn();
int type = tme.getType();
switch (type) {
case TableModelEvent.UPDATE:
currentRow = areenTable.convertRowIndexToView(row);
currentColumn = areenTable.convertColumnIndexToView(col);
if (postUpdateTestFailed()) {
// if the test fails, I want to move back to the edited cell
areenTable.changeSelection(currentRow, currentColumn, false, false);
}
break;
// the rest of switch
} // switch
} // tableChanged() method
编辑1 :我希望之前有人遇到过同样的问题并以某种方式解决了......
编辑2 :我通常会在自己的单元格编辑器实现中执行此操作,并在验证失败时阻止提交。不幸的是,在这种特殊情况下,我必须在提交更改后调用postUpdateTestFailed()
...然后将光标定位到先前编辑的单元格。奇怪的是我可以移动到任何其他单元格,但最后编辑的那个!我认为这是一个错误。
答案 0 :(得分:2)
显示的方法在提交编辑后检查数据,这需要导航回最近编辑的单元格。相反,请在结束之前验证自定义TableCellEditor
中输入的值,如此example所示。
答案 1 :(得分:2)
无法抗拒尝试它(听起来太奇怪了 - 是的,即使我必须尝试一下,看发生了什么,所以下次......; - )
问题是您的监听器在表之前被通知,即内部更新尚未准备好。要工作,请确保在表的内部之后处理它,通过包装到invokeLater,类似
@Override
public void tableChanged(TableModelEvent tme) {
int row = tme.getFirstRow();
int col = tme.getColumn();
int type = tme.getType();
switch (type) {
case TableModelEvent.UPDATE:
final int currentRow = table.convertRowIndexToView(row);
final int currentColumn = table.convertColumnIndexToView(col);
if (currentRow == 0) {
// if the test fails, I want to move back to the edited cell
SwingUtilities.invokeLater(new Runnable() {
public void run() {
table.changeSelection(currentRow, currentColumn, false, false);
}
});
}
break;
// the rest of switch
} // switch
} // tableChanged() method
顺便说一句,我不会在TableModel上监听更改(它们可能以编程方式或其他原因发生,例如基础数据模型中的更改),而是监听表格编辑器或编辑路径/列属性的更改